查看原文
其他

前端后端集成微信支付功能

陈博易 程序IT圈 2020-10-08

来源:陈博易 


https://juejin.im/post/5a0c46646fb9a0451c39f07a


声明:本文是个人原创已授权发布,未经允许请勿转载 。

1前言


  1. 现在的多数App都离不开集成阿里支付宝支付和微信支付 。

  2. 写了两篇关于阿里支付宝支付和微信支付的教程,让大家可以快速在项目中集成支付功能。前面文章已经发过了支付宝的教程 ,没看过的可以点击查看 。

  3. 微信支付是本篇的重点。支付效果图:

2环境以及工具


  1. Android项目:AndroidStudio3.0

  2. Java项目:IntelliJ IDEA 2017.2.3


3整体步骤如下

  1. 微信支付申请流

https://pay.weixin.qq.com/guide/inapp_payment.shtml

商户在微信开放平台申请开发应用后,微信开放平台会生成APP的唯一标识APPID。由于需要保证支付安全,需要在开放平台绑定商户应用包名和应用签名,设置好后才能正常发起支付。

2. Android端环境集成

将微信提供给我们的,wxapi的文件放到我们的主包下面(重要的事情说三次)

3. Android端代码展示
  1. 前端app支付回调核心代码

前端app支付核心代码

4. Java后端代码展示

微信商户的基本参数

这是java后端做的事情,大概看看就好,我们前端就发起支付就好

App支付成功以后,java后端会收到异步回调,也就是对数据库进行操作

最后,附上支付宝和微信支付的工具类代码,如下:

/**
* 微信支付 支付宝支付辅助类
*/

public class PaymentHelper {
   private static final int SDK_PAY_FLAG = 1;

   /**
    * @param activity        调用的activity
    * @param weChatPayEntity 微信调用参数
    */

   public void startWeChatPay(Activity activity, WxChatPayEntity weChatPayEntity) {
       if (activity == null || weChatPayEntity == null) {
           return;
       }
       if (!WxPayConfig.APP_ID.equals(weChatPayEntity.getAppid())) {
           return;
       }
       IWXAPI wxapi = WXAPIFactory.createWXAPI(activity, WxPayConfig.APP_ID, true);
       // 将该app注册到微信
       wxapi.registerApp(WxPayConfig.APP_ID);
       PayReq req = new PayReq();
       req.appId = WxPayConfig.APP_ID;
       req.partnerId = weChatPayEntity.getPartnerid();
       req.prepayId = weChatPayEntity.getPrepayid();
       req.nonceStr = weChatPayEntity.getNoncestr();
       req.timeStamp = weChatPayEntity.getTimeStamp();
       req.packageValue = weChatPayEntity.getPackageValue();// "Sign=" +
       req.sign = weChatPayEntity.getSign();
       wxapi.sendReq(req);
   }

   /**
    * @param activity     调用的activity
    * @param alipayEntity 支付宝参数
    */

   public void startAliPay(final Activity activity, final AlipayEntity alipayEntity) {
       if (activity == null || alipayEntity == null) {
           return;
       }
       Runnable payRunnable = new Runnable() {

           @Override
           public void run() {
               // 构造PayTask 对象
               PayTask alipay = new PayTask(activity);
               // 调用支付接口,获取支付结果
               String result = alipay.pay(alipayEntity.getPayInfo(), true);

               Message msg = new Message();
               msg.what = SDK_PAY_FLAG;
               msg.obj = result;
               mHandler.sendMessage(msg);
           }
       };

       // 必须异步调用
       Thread payThread = new Thread(payRunnable);
       payThread.start();

   }

   @SuppressLint("HandlerLeak")
   private Handler mHandler = new Handler() {
       @SuppressWarnings("unused")
       public void handleMessage(Message msg) {
           switch (msg.what) {
               case SDK_PAY_FLAG: {
                   PayResult payResult = new PayResult((String) msg.obj);
                   /**
                    * 同步返回的结果必须放置到服务端进行验证(验证的规则请看https://doc.open.alipay.com/doc2/
                    * detail.htm?spm=0.0.0.0.xdvAU6&treeId=59&articleId=103665&
                    * docType=1) 建议商户依赖异步通知
                    */

                   String resultInfo = payResult.getResult();// 同步返回需要验证的信息

                   String resultStatus = payResult.getResultStatus();
                   // 判断resultStatus 为“9000”则代表支付成功,具体状态码代表含义可参考接口文档
                   if (TextUtils.equals(resultStatus, "9000")) {
                       Toast.makeText(MyApplication.getContext(), "支付成功", Toast.LENGTH_SHORT).show();
                   } else {
                       // 判断resultStatus 为非"9000"则代表可能支付失败
                       // "8000"代表支付结果因为支付渠道原因或者系统原因还在等待支付结果确认,最终交易是否成功以服务端异步通知为准(小概率状态)
                       if (TextUtils.equals(resultStatus, "8000")) {
                           Toast.makeText(MyApplication.getContext(), "支付结果确认中", Toast.LENGTH_SHORT).show();

                       } else if (TextUtils.equals(resultStatus, "6001")) {
                           Toast.makeText(MyApplication.getContext(), "用户取消支付", Toast.LENGTH_SHORT).show();
                       } else {
                           // 其他值就可以判断为支付失败,包括用户主动取消支付,或者系统返回的错误
                           Toast.makeText(MyApplication.getContext(), "支付失败", Toast.LENGTH_SHORT).show();

                       }
                   }
                   break;
               }
               default:
                   break;
           }
       }

   };

}


4总结


  1. 微信开放平台提供的demo,有一些坑已经帮大家清除了,导入进去就可以支付了,就是代码不优雅 。

  2. 个人封装的demo(微信支付和支付宝支付案例都集成在一起了,直接复制黏贴)

  3. 导入小编项目的姿势要对!

源码地址———关注微信公众号,回复:微信支付宝支付



推荐阅读:



    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存