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

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

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


ndk开源教程地址(入门到放弃篇)


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

  • 6
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值