美文网首页Android开发实战总结AndroidAndroid知识
Android集成支付----支付宝支付总结与封装

Android集成支付----支付宝支付总结与封装

作者: chaohx | 来源:发表于2017-07-05 21:39 被阅读2969次

    前言

    类似于Android集成支付----微信支付总结与封装(可以查看本人另外一篇文章),本文对支付宝支付进行一个总结与封装。相比于微信支付,支付宝支付没有那么多坑。

    集成支付宝支付SDK

    这里只是简要介绍,重点解说有坑的地方,具体参考官方文档,官方文档百度一下就有了。
    1.导入SDK
    支付宝支付导入SDK只需要导入一个jar包,相信这个对于懂Android开发的同学不成问题。
    2.修改Manifest、混淆等
    这些内容照着官方文档复制粘贴即可

    支付宝整体来说还是很人性化的,并没有很多坑。不像微信支付文档里有一些歧义。

    支付宝支付开发步骤

    相信大家通过官方文档可以很轻松的集成支付宝支付SDK,下面我们就直接进入正题。
    1.OrderInfo的获取(签名过程)
    orderInfo的获取,用官方的话来说是签名过程。支付宝官方明确建议,这个过程要放在服务端来做,只需要返回给客户端一个orderInfo字符串即可。


    V}VE}{S6K5ME9PQ`{($ZMG7.png

    如果是放在服务端,那么我们就不用过多关心,只作为一个从服务端请求的字符串即可。
    然而在实际开发中,OrderInfo也有可能放在客户端来做,比如我们的服务端就是这样的,让先请求一个接口,返回给我这么点信息,然后让我自己组装OrderInfo,也就是自己签名,日了狗了。


    Paste_Image.png

    具体的签名过程可以参考官方文档、官方demo,当然还可以看我自己封装的代码。github在下面。

    2.调起支付宝APP
    这个地方非常简单,直接复制官方文档提供的代码即可:

     Runnable payRunnable = new Runnable() {//要在子线程
                @Override
                public void run() {
                    PayTask alipay = new PayTask(RechargeActivity.this);
                    Map<String, String> result = alipay.payV2
                            (orderInfo, true);//这里的orderInfo就是上面说的orderInfo
                    Message msg = new Message();
                    msg.what = SDK_PAY_FLAG;
                    msg.obj = result;
                    mHandler.sendMessage(msg);
                }
            };
            Thread payThread = new Thread(payRunnable);
            payThread.start();
    

    3.支付结果的处理
    这里也同样简单,只需要在mHandler中处理即可

    private Handler mHandler = new Handler() {
            public void handleMessage(Message msg) {
                AliPayResult payResult = new AliPayResult((Map<String, String>) msg.obj);
                switch (payResult.getResultStatus()) {
                    case "9000":
                        GMToastUtil.showToast("支付成功");
                        break;
                    case "8000":
                        GMToastUtil.showToast("正在处理中");
                        break;
                    case "4000":
                        GMToastUtil.showToast("订单支付失败");
                        break;
                    case "5000":
                        GMToastUtil.showToast("重复请求");
                        break;
                    case "6001":
                        GMToastUtil.showToast("已取消支付");
                        break;
                    case "6002":
                        GMToastUtil.showToast("网络连接出错");
                        break;
                    case "6004":
                        GMToastUtil.showToast("正在处理中");
                        break;
                    default:
                        GMToastUtil.showToast("支付失败");
                        break;
                }
            }
        };
    

    签名问题

    这里有一个问题还是有必要说一下的。
    支付宝支付签名有两种,如下图RSA2与RSA,这里支付宝官方推荐RSA2,但也不排除有人会用RSA。比如我们的服务端开发人员,非要用RSA,很不理解。


    Paste_Image.png

    支付宝提供了签名工具,自己操作生成一个公钥和一个私钥,这里的公钥全名是”应用公钥“如上图。私钥自己留着在获取orderInfo(签名过程)处使用。公钥上传到上图位置,要用RSA2就上传到RSA2位置,反之你懂的。
    公钥上传后,支付宝开放平台会自动生成一个支付宝公钥,注意区分”应用公钥“和”支付宝公钥“。这里的支付宝公钥是给服务端用的,服务端在异步回调时验签。

    支付宝支付的封装

    支付宝同样不涉及很多业务逻辑,完全可以封装成工具类以便下次使用。封装后的使用非常简单,如下代码,详细代码可以看我的github,地址在文末。

            //签名在客户端
            findViewById(R.id.btn1).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    //假设已经从服务端获取必要数据
                    MyALipayUtils.ALiPayBuilder builder = new MyALipayUtils.ALiPayBuilder();
                    builder.setAppid("123")
                            .setRsa("456")//根据情况设置Rsa2与Rsa
                            .setMoney("0.01")//单位时分
                            .setTitle("支付测试")
                            .setOrderTradeId("487456")//从服务端获取
                            .setNotifyUrl("fdsfasdf")//从服务端获取
                            .build()
                            .toALiPay(MainActivity.this);
                }
            });
            //签名在服务端
            findViewById(R.id.btn2).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    //假设已从服务端获取orderInfo
                    String orderInfo = "";
                    MyALipayUtils.ALiPayBuilder builder = new MyALipayUtils.ALiPayBuilder();
                    builder.build().toALiPay(MainActivity.this, orderInfo);
    
                }
            });
    

    该文章到此告一段落,希望对大家有所帮助,详细封装代码github地址:https://github.com/chaohengxing/ALiPayUtils

    相关文章

      网友评论

      • Vove7:签约 需要营业执照额,,
      • 痴迷_d6b5:大佬在吗??报系统繁忙什么鬼啊??
        chaohx:@痴迷_d6b5 问题解决了吗?没有的话可以加我QQ 396965650
        痴迷_d6b5:@chaohx 后台直接返回了带签名的订单信息 接下来我该怎么做呢 求解。。
        chaohx:多半是签名问题 让后端检查一下签名
      • 啟风了:十分感谢
      • 杰瑞_fff3:大佬在么? encodedSign = URLEncoder.encode(oriSign, "UTF-8");这行报空,参数都填了啊
      • 戈壁老曹:作者您好!有个小瑕疵,“签名问题”那应该是“支付宝推荐RSA2”。:smile:
        学习了,谢谢!
        杰瑞_fff3:大佬在么? encodedSign = URLEncoder.encode(oriSign, "UTF-8");这行报空,参数都填了啊
        chaohx::smile: 感谢感谢,已改正
      • AndYMJ:你这链接好像有问题吧!什么都没有
        AndYMJ: @chaohx 谢谢
        chaohx:代码忘记提交了,谢谢提醒:smile:

      本文标题:Android集成支付----支付宝支付总结与封装

      本文链接:https://www.haomeiwen.com/subject/zxaqhxtx.html