Android 微信支付接入流程

作者: 徘徊0_ | 来源:发表于2019-07-25 11:50 被阅读0次

一、Android微信支付集成,准备工作

1,微信开放平台 注册,获取App id等信息

注册自己的应用.png

注册过程中填写相应的信息即可,需要注意应用签名的获取。

应用签名.png
应用签名获取步骤:
  • 找到自己项目的签名文件,比如我的存放在项目中,如下图:


    签名文件.png
  • 打开命令提示框,输入keytool -v -list -keystore 路径 ,输入密码后会显示出jks信息,例如:
    获取签名信息.png
    注意:这里的MD5就是需要的,将中间的 : 删除,就是应用签名,也可以通过微信的一个工具apk,来获取微信应用签名获取apk下载 ,可以通过该工具对比 上面的MD5,是否一致!应用信息填写完毕,然后提交申请即可。
获取应用签名工具.png

2,Android端集成

  • 在app model下添加以下依赖:
    //wx 支付依赖(包含统计功能)
    implementation 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+'

    //不包含统计功能
    //implementation 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:+'

  • 接收微信回调需要一个WXPayEntryActivity,目录如下图,推荐直接拷贝微信demo中的类,这里需要注意WXPayEntryActivity 路径必须为:绑定的商户应用包名 + wxapi + WXPayEntryActivity,比如:我在微信开发平台注册包名为:com.example.wxWXPayEntryActivity 的路径就需要为:com.example.wx.wxapi.WXPayEntryActivity
    微信回调的类.png

注:微信demo

附上自己的类:

public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler {
    private static final String TAG = "WXPayEntryActivity";

    private IWXAPI api;
    private String app_id = "";//微信开发后台申请的app_id

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //这里可以不填写
//        setContentView(R.layout.pay_result);

        api = WXAPIFactory.createWXAPI(this, app_id);
        api.handleIntent(getIntent(), this);
    }

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        setIntent(intent);
        api.handleIntent(intent, this);
    }

    @Override
    public void onReq(BaseReq req) {
    }

    /**
     * 处理结果回调
     *
     * @param resp
     */
    @Override
    public void onResp(BaseResp resp) {
        Log.d(TAG, "onPayFinish, errCode = " + resp.errCode);

        if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {

            switch (resp.errCode) {
                case 0://支付成功
                    Toast.makeText(this, "支付成功", Toast.LENGTH_SHORT).show();
                    Log.d(TAG, "onResp: resp.errCode = 0   支付成功");
                    break;
                case -1://错误,可能的原因:签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、其他异常等
                    Toast.makeText(this, "支付错误" + resp.errCode, Toast.LENGTH_SHORT).show();
                    Log.d(TAG, "onResp: resp.errCode = -1  支付错误");
                    break;
                case -2://用户取消,无需处理。发生场景:用户不支付了,点击取消,返回APP。
                    Log.d(TAG, "onResp: resp.errCode = -2  用户取消");
                    Toast.makeText(this, "用户取消" + resp.errCode, Toast.LENGTH_SHORT).show();
                    break;

            }

            finish();//这里需要关闭该页面
        }

    }

}

需要在注册清单AndroidManifest.xml中添加权限与WXPayEntryActivity

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

    <activity
            android:name=".wxapi.WXPayEntryActivity"
            android:exported="true"
            android:launchMode="singleTop"/>
  • 调用API前,需要先向微信注册您的APPID,注册微信支付App Id,有两种方式
//*********1,清单文件中直接注册********
        <activity android:name=".wxapi.WXPayEntryActivity"
            android:exported="true"
            android:launchMode="singleTop" >
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />

                <category android:name="android.intent.category.DEFAULT" />

                <!--这里填写你申请的app id-->
                <data android:scheme="app id" />
            </intent-filter>
        </activity>


//**************2,在应用入口Application,app id注册到微信************************
IWXAPI msgApi = WXAPIFactory.createWXAPI(context, null);

// 将该app id 注册到微信   AppID: 申请到的AppID
msgApi.registerApp(AppID);

二、Android 支付过程

1,Android端与后台交互的大致流程如下:

微信支付,Android端流程.png

2,发起微信支付
Android App 调起微信支付所需的参数如下,这里的参数绝大多数是上图流程中调用后台订单接口返回:

调起微信支付所需要的请求参数 .png

后台返回数据后,调起微信支付的代码如下:

/**
     * 调支付的方法
     * <p>
     * 注意: 每次调用微信支付的时候都会校验 appid 、包名 和 应用签名的。 这三个必须保持一致才能够成功调起微信
     *
     * @param wxPayBean
     */
    private void startWechatPay(WxPayBean wxPayBean) {
        tv_paylist.setText(tv_paylist.getText() + "\n\n调起微信支付....");

        //这里的appid,替换成自己的即可
        IWXAPI api = WXAPIFactory.createWXAPI(this, Constant.WxPayAppId);
        api.registerApp(Constant.WxPayAppId);

        //这里的bean,是服务器返回的json生成的bean
        PayReq payRequest = new PayReq();
        payRequest.appId = Constant.WxPayAppId;
        payRequest.partnerId = wxPayBean.getPartnerid();
        payRequest.prepayId = wxPayBean.getPrepayid();
        payRequest.packageValue = "Sign=WXPay";//固定值
        payRequest.nonceStr = wxPayBean.getNoncestr();
        payRequest.timeStamp = wxPayBean.getTimestamp();
        payRequest.sign = wxPayBean.getSign();

        //发起请求,调起微信前去支付
        api.sendReq(payRequest);
    }

这里的WxPayBean 是自己写的一个请求参数的实体类:

public class WxPayBean {
    private String appid;//微信开放平台审核通过的应用APPID
    private String partnerid;//微信支付分配的商户号
    private String prepayid;//微信返回的支付交易会话ID
//        private String package;// 扩展字段 暂填写固定值Sign=WXPay
    private String noncestr;//随机字符串,随机字符串,不长于32位。推荐随机数生成算法
    private String sign;//签名,详见签名生成算法注意:签名方式一定要与统一下单接口使用的一致
    private String timestamp;//时间戳,请见接口规则-参数规定

   .......
}

3,微信支付结果回调在 {@link WXPayEntryActivity#onResp(BaseResp)}
只贴出该方法,具体类上面已经贴出:

/**
     * 处理结果回调
     *
     * @param resp
     */
    @Override
    public void onResp(BaseResp resp) {
        Log.d(TAG, "onPayFinish, errCode = " + resp.errCode);

        if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {

            switch (resp.errCode) {
                case 0://支付成功
                    Toast.makeText(this, "支付成功", Toast.LENGTH_SHORT).show();
                    Log.d(TAG, "onResp: resp.errCode = 0   支付成功");
                    break;
                case -1://错误,可能的原因:签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、其他异常等
                    Toast.makeText(this, "支付错误" + resp.errCode, Toast.LENGTH_SHORT).show();
                    Log.d(TAG, "onResp: resp.errCode = -1  支付错误");
                    break;
                case -2://用户取消,无需处理。发生场景:用户不支付了,点击取消,返回APP。
                    Log.d(TAG, "onResp: resp.errCode = -2  用户取消");
                    Toast.makeText(this, "用户取消" + resp.errCode, Toast.LENGTH_SHORT).show();
                    break;

            }

            finish();//这里需要关闭该页面
        }

    }

附:微信支付Api

三、微信支付接入过程遇到的坑

1,支付不回调问题
如果获取不到支付回调,请检查一下WXPayEntryActivity放置的路径;微信支付必须要求该类的路径为:包名.wxapi.WXPayEntryActivity,不然不能回调。

2,申请App Id,应用签名的获取
如果接入有问题,请使用排查一下是否申请app id的时候,应用签名是否有误,推荐使用微信应用签名获取apk 来校验,填入自己应用包名即可查看应用签名。

3,在微信后台申请完app以后,注意监测是否获得微信支付的能力,需要单独申请
微信支付中,如果报appidmech_id(微信支付分配的商户号)的错,应该就是要支持支付功能的App的appid与商户平台的商户id不对应造成的。

微信支付的能力.png

附:检测是否安装微信app

   /**
     * 判断微信是否安装
     * @param context
     * @return true 已安装   false 未安装
     */
    public  static boolean isWxAppInstalled(Context context) {
        IWXAPI wxApi = WXAPIFactory.createWXAPI(context, null);
        wxApi.registerApp(Wx.APP_ID);
        boolean bIsWXAppInstalled = false;
        bIsWXAppInstalled = wxApi.isWXAppInstalled();
        return bIsWXAppInstalled;
    }

相关文章

  • 微信App支付接入&支付流程

    微信App支付接入&支付流程 最近对微信App支付(App端集成微信支付SDK)申请步骤,以及终端在进行微信支付时...

  • android 微信 支付 接入流程总结

    [TOC] 客户端微信支付 android 接入微信指南android 资源下载页微信支付 开发文档 登录微信官方...

  • 如何将<微信APP支付>完全剥离成单独Module

    本文面向有一定微信APP支付(以下简称微信支付)接入经验的开发者 首先,我们先要明白微信支付的简单支付流程,流程如...

  • iOS 微信支付

    微信支付接入流程: 下载微信支付idk 地址: https://open.weixin.qq.com/cgi-bi...

  • iOS支付三部曲之集成微信支付

    一. 微信支付步骤 二. 微信支付流程 下图是微信开发者文档给的流程图 流程图看着繁琐其实具体就三步: app接入...

  • 小程序学习笔记-微信支付避坑指南

    小程序接入微信支付避坑指南 微信支付的整体申请流程,一图以蔽之。 微信支付申请流程 容易掉坑的地方集中在「登记商户...

  • 微信授权接入流程

    Android微信接入流程大致总结: 前言: 微信现在已经无处不在了,对于微信授权接入的流程,大致总结了一下。 1...

  • Android 微信支付接入流程

    一、Android微信支付集成,准备工作 1,微信开放平台 注册,获取App id等信息 注册过程中填写相应的信息...

  • android 支付宝 接入流程总结

    支付宝接入流程 支付宝开发文档android集成流程新版支付宝接入流程 导入开发资源 将alipaySdk-xxx...

  • Android支付宝支付详解

    微信支付参考:android微信支付详解与坑官方文档:App支付Android集成流程 好久之前写过支付一直没做个...

网友评论

    本文标题:Android 微信支付接入流程

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