Android|Android 微信支付接入流程

一、Android微信支付集成,准备工作 1,微信开放平台 注册,获取App id等信息
Android|Android 微信支付接入流程
文章图片
注册自己的应用.png 注册过程中填写相应的信息即可,需要注意应用签名的获取。

Android|Android 微信支付接入流程
文章图片
应用签名.png
应用签名获取步骤:

  • 找到自己项目的签名文件,比如我的存放在项目中,如下图:

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

  • 调用API前,需要先向微信注册您的APPID,注册微信支付App Id,有两种方式
//*********1,清单文件中直接注册******** //**************2,在应用入口Application,app id注册到微信************************ IWXAPI msgApi = WXAPIFactory.createWXAPI(context, null); // 将该app id 注册到微信AppID: 申请到的AppID msgApi.registerApp(AppID);

二、Android 支付过程 1,Android端与后台交互的大致流程如下:

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

Android|Android 微信支付接入流程
文章图片
调起微信支付所需要的请求参数 .png
后台返回数据后,调起微信支付的代码如下:
/** * 调支付的方法 * * 注意: 每次调用微信支付的时候都会校验 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 = "https://www.it610.com/article/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以后,注意监测是否获得微信支付的能力,需要单独申请
微信支付中,如果报appid和mech_id(微信支付分配的商户号)的错,应该就是要支持支付功能的App的appid与商户平台的商户id不对应造成的。

Android|Android 微信支付接入流程
文章图片
微信支付的能力.png
【Android|Android 微信支付接入流程】附:检测是否安装微信app
/** * 判断微信是否安装 * @param context * @return true 已安装false 未安装 */ publicstatic boolean isWxAppInstalled(Context context) { IWXAPI wxApi = WXAPIFactory.createWXAPI(context, null); wxApi.registerApp(Wx.APP_ID); boolean bIsWXAppInstalled = false; bIsWXAppInstalled = wxApi.isWXAppInstalled(); return bIsWXAppInstalled; }

    推荐阅读