Android集成支付宝踩过的坑

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;
            }

基本上就这么多了,有问题的可以留言啊。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值