美文网首页
2018-06-04

2018-06-04

作者: degrty | 来源:发表于2018-06-04 22:26 被阅读20次

    利用沙箱测试调用支付宝

    今天我们来介绍下如何利用沙箱测试调用支付宝

    首先登陆蚂蚁金服官网:https://docs.open.alipay.com
    登陆的账号是用自己的支付宝账号,然后在首页导航栏找到开发接入,然后在下面找到沙箱

    shaxiang.png

    点击进去,他会自动帮你生成沙箱账号,里面包括一个买家账号和一个买家账号


    sha.png

    然后点击沙箱应用,他已经帮我自动生成appID,我们需要做的就是生成Rsa2


    sha2.png

    生成公钥和私钥的具体的步骤 https://docs.open.alipay.com/291/105971
    记住私钥后面会用到。

    下载支付宝客户端,并用买家账号登陆


    sha3.png

    下载官方demo,并导入到Androidstdio。
    下载地址:https://docs.open.alipay.com/54/104509

    然后我们需要在PayDemoActivity.class添加配置信息
    步骤一

    @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.pay_main);
                    //添加下面这行代码,表示启用沙箱环境
            EnvUtils.setEnv(EnvUtils.EnvEnum.SANDBOX);
        }
    

    步骤二

    /** 支付宝支付业务:入参app_id */
        public static final String APPID = "沙箱应用的appId";
        
        /** 支付宝账户登录授权业务:入参pid值 */
        public static final String PID = "商家账号的UID";
        /** 支付宝账户登录授权业务:入参target_id值 */
        public static final String TARGET_ID = "";
    
        /** 商户私钥,pkcs8格式 */
        /** 如下私钥,RSA2_PRIVATE 或者 RSA_PRIVATE 只需要填入一个 */
        /** 如果商户两个都设置了,优先使用 RSA2_PRIVATE */
        /** RSA2_PRIVATE 可以保证商户交易在更加安全的环境下进行,建议使用 RSA2_PRIVATE */
        /** 获取 RSA2_PRIVATE,建议使用支付宝提供的公私钥生成工具生成, */
        /** 工具地址:https://doc.open.alipay.com/docs/doc.htm?treeId=291&articleId=106097&docType=1 */
        public static final String RSA2_PRIVATE = "私钥";
        public static final String RSA_PRIVATE = "";
    

    注:TARGET_ID还不知道如何获得,官网给出的解释
    https://tech.open.alipay.com/support/knowledge/index.htm?categoryId=24153&knowledgeId=201602074386&scrollcheck=1#/?_k=uizo6i

    步骤三
    运行程序,运行截图如下:


    2.jpg
    0.jpg

    总结:
    调用接口的详细流程图


    1.jpg

    主要流程
    a.向服务器发送请求,服务器返回订单信息

    /**
           * 这里只是为了方便直接向商户展示支付宝的整个支付流程;所以Demo中加签过程直接放在客户端完成;
           * 真实App里,privateKey等数据严禁放在客户端,加签过程务必要放在服务端完成;
           * 防止商户私密数据泄露,造成不必要的资金损失,及面临各种安全风险; 
           * 
           * orderInfo的获取必须来自服务端;
           */
          boolean rsa2 = (RSA2_PRIVATE.length() > 0);
          Map<String, String> params = OrderInfoUtil2_0.buildOrderParamMap(APPID, rsa2);
          String orderParam = OrderInfoUtil2_0.buildOrderParam(params);
    
          String privateKey = rsa2 ? RSA2_PRIVATE : RSA_PRIVATE;
          String sign = OrderInfoUtil2_0.getSign(params, privateKey, rsa2);
          final String orderInfo = orderParam + "&" + sign;
    

    b.调用支付宝异步请求发起支付

    Runnable payRunnable = new Runnable() {
    
              @Override
              public void run() {
                  PayTask alipay = new PayTask(PayDemoActivity.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();
    

    c.处理回调结果

    @SuppressLint("HandlerLeak")
       private Handler mHandler = new Handler() {
           @SuppressWarnings("unused")
           public void handleMessage(Message msg) {
               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();
                   }
                   break;
               }
    

    其实调用支付宝可以实现的功能还是很多的,更多详情就要看支付宝的官方API文档了

    以上就是沙箱测试支付宝支付的所有代码了,如有帮助请点个赞吧!!!

    如有问题,欢迎留言讨论!!!

    相关文章

      网友评论

          本文标题:2018-06-04

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