Android集成支付宝
一.集成前的准备工作
申请公钥私钥的流程就不再赘述,具体流程请参照官方demo。 首先要确定你的支付宝APP支付功能是什么时候申请的,如果是8月6号以前申请的,使用支付宝2.0sdk时会出现支付失败的问题,小主当时费了一天的时间才搞清楚这个问题。解决方案有两种,一 种是使用支付宝1.0sdk,这是最简单有效的方法,大家下载sdk的时候,移步老版本就好支付宝sdk1.0地址,另一种解决方案就是致电支付宝客服,先解约再重新签约APP支付能力就可以了。
二.支付宝1.0sdk
支付宝1.0sdk集成较为简单,官方的demo里面方法很详细,订单是通过getOrderInfo()这个方法拼接字符串构建出来的,提交给服务器,服务器端返回签名好的订单信息orderInfo,然后将orderInfo与签名好的订单信息进行拼接生 成支付信息payInfo,之后调用支付宝的接口,获取支付结果。
代码如下
Runnable payRunnable = new Runnable() {
@Override
public void run() {
// 构造PayTask 对象
PayTask alipay = new PayTask(MainActivity.this);
// 调用支付接口,获取支付结果
String result = alipay.pay(payInfo, true);
Message msg = new Message();
msg.what = SDK_PAY_FLAG;
msg.obj = result;
mHandler.sendMessage(msg);
}
};
三.支付宝2.0sdk
支付宝2.0sdk集成时的难点在于订单参数顺序的一致性,即提交给服务器的订单参数顺序,和要与服务器签名的订单参数顺序相一致,小主这边的订单信息是通过TreeMap和将BizContent对象转为json字符串进行构建,其中这个BizContent类是商品的相关信息,最终生成的订单格式见官方demo,大家可以自己在客户端生成签名和从服务器获取的签名进行对比,如果不一致,检查构造订单的参数顺序,最终提交给支付宝的订单信息如下(其中要对所有key对应的value进行url编码)。
代码如下
public void getOrder(){
BizContent bizContent = new BizContent();
bizContent.body = info.body;
bizContent.out_trade_no = info.out_trade_no;
bizContent.product_code = info.product_code;
bizContent.subject = info.subject;
bizContent.timeout_express = info.timeout_express;
bizContent.total_amount = info.total_amount;
Gson gson = new Gson();
String toJson = gson.toJson(bizContent);
Log.d(TAG, "toJson: " + toJson);
Map<String, String> tempMap1 = new TreeMap<>();
tempMap1.put("timestamp", info.timestamp);
tempMap1.put("biz_content", toJson);
tempMap1.put("sign_type", "RSA");
tempMap1.put("notify_url", "http://61.150.12.35:8088/HelloRunner/alipayResult");
tempMap1.put("charset", "utf-8");
tempMap1.put("method", "alipay.trade.app.pay");
tempMap1.put("app_id", "2016063001568967");
StringBuilder sb = new StringBuilder();
for (String key : tempMap1.keySet()) {
//对订单参数的value进行url编码 sb.append(key).append("=").append(URLEncoder.encode(tempMap1.get(key), "utf-8")).append("&");
}
sb.append("version=1.0");
final String orderNo = sb.toString();
String signEncode = URLEncoder.encode(info.sign, "utf-8");
orderInfo = orderNo + "&sign=" + signEncode;
Log.d("orderInfoWrong", "orderInfo: " + orderInfo);
Runnable payRunnable = new Runnable() {
@Override
public void run() {
PayTask alipay = new PayTask(PayActivity.this);
Map<String, String> result = alipay.payV2(orderInfo, true);
Log.i("msp", result.toString());
Message msg = new Message();
msg.what = SDK_PAY_FLAG;
msg.obj = result;
mHandler.sendMessage(msg);
}
};
Thread payThread = new Thread(payRunnable);
payThread.start();
}
public class BizContent {
public String body;
public String out_trade_no;
public String product_code;
public String subject;
public String timeout_express;
public String total_amount;
}
基本上就这么多了,有问题的可以留言啊。