Android 微信 支付宝支付,2行代码实现支付

作者简介

微信公众号(高质量文章推送):走向全栈工程师
作者:陈博易
声明:本文是个人原创,未经允许请勿转载
商业合作请在微信公众号回复:联系方式


支付宝支付
微信支付

前言


  1. 现在的多数App都离不开集成阿里支付宝支付和微信支付
  2. 准备写两篇关于阿里支付宝支付和微信支付的教程,让大家可以快速集成支付
  3. Android前端 Java后端 集成支付宝支付
  4. 微信支付是本篇的重点

环境以及工具


  1. Android项目:AndroidStudio3.0
  2. Java项目:IntelliJ IDEA 2017.2.3

整体步骤


  1. 微信支付申请流程
  2. Android端环境集成
  3. Android端代码展示
  4. Java后端代码展示

详细步骤


请参考微信支付开发文档
https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_1

核心步骤解读


1. 微信支付申请流程

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

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

2. Android端环境集成

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

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

微信商户的基本参数

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

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

image.png
/**
 * Create by: 陈博易
 * Date: 2017/12/1
 * time:  16:01
 * Email: 495057454@qq.com
 * 微信公众号:走向全栈工程师
 * <p>
 * 微信支付 支付宝支付辅助类
 */
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;
            }
        }

    };


}

总结


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

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

  3. 请大家多关注关注我。

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

个人相关教程

各种大佬推荐的编程视频资源分享
Android前端 Java后端 集成支付宝支付
postman使用 Android java后端 接口调试工具
Android抓包 Charles http接口调试
消息推送 Android java后端集成小米推送
如何导入简单的java项目-IntelliJ IDEA

请关注我(高质量文章推送)

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

长按二维码“识别”关注或者扫一扫

推荐阅读更多精彩内容

  • 一转眼,你来了; 一转眼,你长大了; 一转眼,你走了。 一转眼,你又来了; 一转眼,你也长大了; 一转眼,你又走了...
    凌心ing阅读 69评论 0 1
  • 公共场合下最忌讳闹音和杂音,特别是安静和比较安静的地方。 一般图书馆、博物馆等地方都会明显提示安静,不要刻意弄出点...
    叨声依旧阅读 130评论 0 1
  • 接触社会后才知道英语有多重要,本人现在处于实习阶段,是个美小护,临床上接触的老师学历都不怎么高,但是大家却各自身怀...
    w逍遥散人w阅读 121评论 1 0
  • 传闻家长会具有小三的性质,都会破坏家庭和谐。周二刚刚开完家长会,为了想证明我真没有“当小三”,第二天专门又开了个座...
    emilyduck阅读 351评论 0 5
  • 心血来潮,想着买个小米Note,注册了帐号之后,点了预约,之后要绑定手机。 然后吧,莫名的喜感,想到一个人如果没有...
    尼枚哉阅读 949评论 12 9