三方

Android集成第三方支付

2019-08-26  本文已影响0人  锐心凌志

银联支付,支付宝支付,微信支付的三大支付总结,之前也有写过两篇。

三大支付总结:

http://blog.csdn.net/androidstarjack/article/details/72669394

支付宝植入总结:

android 支付宝的植入 《曾经踩过的坑》

微信支付总结:

Android 微信支付总结

正文

之前有做过支付宝支付和微信支付,所以这次做起来碰到的问题很少,key申请下来之后很快就搞定了。吼吼

效果图:

由于用鲁大师去截屏获取gif,鲁大师一针一针绘制图片的时候应该没做好处理,导致跳转到相应的界面出现黑屏现象。在手机上正常跳转,无黑屏现象。大家不用担心这个

备注:出于安全考虑,验签我们都是放到后台进行验签的。对于我们移动端节省了很多的劳动力。

准备:

需要以公司名义,在支付宝,微信等平台上开通公司账户并且认证,如:支付过程中需要公司的帐号和商户号。

支付宝支付

如果碰到一些坑的话,请参考我之前写过的意一篇支付宝踩坑的文章:

android 支付宝的植入 《曾经踩过的坑》

  1. 首先支付宝申请并集成支付宝SDK 这里不再详细介绍
  1. 获取订单信息(根据自己公司的实际情况:可以在服务端完成,也可以在本地完成)

  2. 客户端拿这些订单信息向服务器后台进行请求,返回支付签名信息signInfo

  3. app携带支付信息,调用支付接口请求支付宝客户端,从而调起支付界面

/**
         * 支付宝进行请求
         *
         * @param signInfo
         */
        private void payToOrderService(final String signInfo) {
            new Thread() {
                @Override
                public void run() {
                    super.run();                                        PayTask payTask = new PayTask(MyScannerPayActivity.this);
                    // String result = payTask.pay(signInfo, true);                                        Map<String, String> result = payTask.payV2(signInfo, true);                                      Message message = mHandler.obtainMessage();
                    message.what = SDK_PAY_FLAG;
                    message.obj = result;
                    mHandler.sendMessage(message);

                }
            }.start();
        }
  1. 用户操作,输入密码支付,支付成功;直接返回取消支付;出现错误,支付失败;进入支付界面,但输入密码支付,支付待确认;

  2. 支付宝客户端将支付结果告诉app客户端,商户服务器通知app服务器支付结果;

  3. app客户端处理支付结果;

  4. app服务器处理支付结果。

处理结果通知:

private Handler mHandler = new Handler() {        @Override
        public void handleMessage(Message msg) {                        super.handleMessage(msg);                           switch (msg.what) {                    case SDK_PAY_FLAG:
                    PayResult payResult = null;                              
                    try {
                        payResult = new PayResult((Map<String, String>) msg.obj);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }                    /**                     对于支付结果,请商户依赖服务端的异步通知结果。同步通知结果,仅作为支付结束的通知。                     */
                    String resultInfo = payResult.getResult();// 同步返回需要验证的信息
                    String resultStatus = payResult.getResultStatus();                    // 判断resultStatus 为9000则代表支付成功
                    if (TextUtils.equals(resultStatus, PAY_OK)) {

                        ActivityUtils.showActivity(MyScannerPayActivity.this, ScannerPaySuccessActivity.class);
                        finish();
                    } else if (TextUtils.equals(resultStatus, PAY_FAILED)) {//------------------------->支付失败
                        // 该笔订单真实的支付结果,需要依赖服务端的异步通知。
                        Toast.makeText(MyScannerPayActivity.this, "" + payResult.getMemo(), Toast.LENGTH_LONG).show();
                    } else if (TextUtils.equals(resultStatus, PAY_CANCLE)) {//-------------------------->交易取消
                        Toast.makeText(MyScannerPayActivity.this, "" + payResult.getMemo(), Toast.LENGTH_LONG).show();
                    } else if (TextUtils.equals(resultStatus, PAY_NET_ERR)) {//------------------------->网络出现错误
                        Toast.makeText(MyScannerPayActivity.this, "" + payResult.getMemo(), Toast.LENGTH_LONG).show();
                    } else if (TextUtils.equals(resultStatus, PAY_WAIT_CONFIRM)) {//--------------------->交替等待
                    }                     break;
            }
        }
    };

银联支付

先看一下官方给我们的银联支付流程图:
image.gif

大家不要被这张图片搞懵逼的了,其实很简单,这里我将其分为5小步。

结果返回:

处理银联手机支付控件返回的支付结果

调用银联支付后,返回app的时候用了,看返回结果传,成功,失败,或者是什么返回。

如图所示:
image image.gif
最后注意在调用:

/*****************************************************************
 * mMode参数解释: "00" - 启动银联正式环境 "01" - 连接银联测试环境 *****************************************************************/
private final String mMode = "00";

注意:

tn值就是上面第三后台给的tn,给到服务器那里, 这里我这边是通过后台请求下来的,关于mMode,看第一步骤,自己改一下就行了,00开发环境,01测试环境。但是要注意,这个只是个回调接口方法。

总感觉银联支付的SDK调用起来怪怪的,貌似回到了原始深林。

微信支付:

微信支付总结:

http://blog.csdn.net/androidstarjack/article/details/50951941

接入流程图:
  1. 申请开发者账号 地址:https://open.weixin.qq.com/ 进入管理中心,创建移动应用

  2. 申请支付能力

  3. 代码集成微信支付

相关的支付调用代码:

IWXAPI mWxApi = WXAPIFactory.createWXAPI(mContext, WX_APPID, true);
 mWxApi.registerApp(WX_APPID);         /**
          * 请求app服务器得到的回调结果
          */
         @Override
         public void onGet(JSONObject jsonObject) {                         if (mWxApi != null) {
                 PayReq req = new PayReq();

                 req.appId = WX_APPID;// 微信开放平台审核通过的应用APPID
                 try {
                     req.partnerId = jsonObject.getString("partnerid");// 微信支付分配的商户号
                     req.prepayId = jsonObject.getString("prepayid");// 预支付订单号,app服务器调用“统一下单”接口获取
                     req.nonceStr = jsonObject.getString("noncestr");// 随机字符串,不长于32位,服务器小哥会给咱生成
                     req.timeStamp = jsonObject.getString("timestamp");// 时间戳,app服务器小哥给出
                     req.packageValue = jsonObject.getString("package");// 固定值Sign=WXPay,可以直接写死,服务器返回的也是这个固定值
                     req.sign = jsonObject.getString("sign");// 签名,服务器小哥给出,他会根据:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=4_3指导得到这个
                 } catch (JSONException e) {
                     e.printStackTrace();
                 }
                 mWxApi.sendReq(req);
                 Log.d("发起微信支付申请");
             }

         }
注意事项:
上一篇下一篇

猜你喜欢

热点阅读