支付宝集成
支付宝集成流程:
支付宝接入步骤需要以下四步:
1:创建应用并获取appid,
2:配置秘钥
3:集成并配置SDK
4:调用接口
一:创建应用并获取appid
1:首先需要去创建应用,地址如下:
2:点击创建按钮:跳转到如下界面:
二:配置秘钥
步骤如下:
1: 在应用环境里面,点击设置应用公钥,出现如下界面:
2:点击获取验证码:
填入验证码以后点击确定按钮,跳转如下界面:
点击支付宝生成器,进行下载以及安装,跳转如下界面:点击生成公钥,出现如下界面:
复制公钥到如下窗口:
点击验证公钥正确性,跳转到如下界面进行验证:
点击下载按钮,去下载签名工具,通过私钥对 json进行加密:运行起来,到如下界面:
将私钥复制到左边框,效果如下:
点击生成签名,效果如下:
复制加密文本到如下界面进行验证:
点击验证按钮,验证是不是解密成功
如果跳转到公钥页面,说明验证成功,点击保存按钮,保存公钥
以上步骤应用公钥设置成功.
三::集成并配置SDK
接入移动支付需要集成两个SDK,客户端SDK需要集成在商户自己的APP中,用于唤起支付宝APP并发送交易数据,并在支付宝APP返回商户APP时获得支付结果。服务端SDK需要商户集成在自己的服务端系统中,用于协助解析并验证客户端同步返回的支付结果和异步通知
按照支付宝开发文档将SDK集成完成以后,
1:首先需要通过如下方法生成 orderParam,
方法如下:
Map<String, String> params = OrderInfoUtil2_0.buildOrderParamMap(APPID);
String orderParam = OrderInfoUtil2_0.buildOrderParam(params);
生成的时候需要的参数包括如下:
1: appid
2:biz_content :订单信息
3:charset 编码格式
4:method 方法
5:sign_type 加密方式
6:timestamp 时间戳
7:version :当前版本
通过以上7个参数生成 orderParam 代码如下:
public static Map<String, String> buildOrderParamMap(String app_id) {
Map<String, String> keyValues = new HashMap<String, String>();
keyValues.put("app_id", app_id);
keyValues.put("biz_content", "{\"timeout_express\":\"30m\",\"product_code\":\"QUICK_MSECURITY_PAY\",\"total_amount\":\"0.01\",\"subject\":\"1\",\"body\":\"我是测试数据\",\"out_trade_no\":\"" + getOutTradeNo() + "\"}");
keyValues.put("charset", "utf-8");
keyValues.put("method", "alipay.trade.app.pay");
keyValues.put("sign_type", "RSA");
keyValues.put("timestamp", "2016-07-29 16:55:53");
keyValues.put("version", "1.0");
return keyValues;
}
2:通过服务器提供的接口 去获取 orderInfo 这个参数,
提交参数为:
params,orderParam
服务器需要执行的代码如下:
String sign = OrderInfoUtil2_0.getSign(params, RSA_PRIVATE);
final String orderInfo = orderParam + "&" + sign;
orderInfo 包括以下三部分组成: appid & 私钥
3:开启子线程,去调用支付宝的支付行为:具体代码如下:
PayTask alipay = new PayTask(PayDemoActivity.this);
Map<String, String> result = alipay.payV2(orderInfo, true);
(1)同步执行的支付成功,会发送消息到主线程:代码如下:
switch (msg.what) {
case SDK_PAY_FLAG: {
@SuppressWarnings("unchecked")
PayResult payResult = new PayResult((Map<String, String>) msg.obj);
/**
对于支付结果,请商户依赖服务端的异步通知结果。同步通知结果,仅作为支付结束的通知。
*/
String resultInfo = payResult.getResult();// 同步返回需要验证的信息
String resultStatus = payResult.getResultStatus();
// 判断resultStatus 为9000则代表支付成功
if (TextUtils.equals(resultStatus, "9000")) {
// 该笔订单是否真实支付成功,需要依赖服务端的异步通知。
Toast.makeText(PayDemoActivity.this, "支付成功", Toast.LENGTH_SHORT).show();
} else {
// 该笔订单真实的支付结果,需要依赖服务端的异步通知。
Toast.makeText(PayDemoActivity.this, "支付失败", Toast.LENGTH_SHORT).show();
}
(2):支付成功以后,支付宝会通知我们的服务器支付成功
(3):在同步支持成功以后,我们去调用我们服务器的接口,等待服务器返回解雇
(4):当支付宝通知服务器支持成功以后,服务器把支付成功的结果返回我们,我们认为支付成功
面试中如何讲支付宝流程:
首先第一步注册获取 appid
第二在客户端通过支付宝提供的 appid ,生成两个参数,一个叫 params,orderParam(里面包括用户的订单信息,一般讲id提交给服务器)
第三:通过服务器提供的接口把 params,orderParam,这俩参数提交给服务器,服务器给我们返回订单信息,orderInfo,(这个东西服务器是经过非对称加密的,支付宝去解密)
第四:通过调用支付宝提供的方法将 orderInfo,提交给支付宝,提交成功以后,支付宝会通过Hander 返回成功
,但是这个我们不会认为成功,在这里我们会通过一个接口去请求服务器,因为支付宝支付成功以后会通知我们的服务器,当服务器接收到支付宝支付成功以后,在这个接口将成功的订单信息返回给我们,这个时候,我们认为支付宝真正支付成功.