Android|Android 微信支付接入流程
一、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.wx
,WXPayEntryActivity
的路径就需要为:com.example.wx.wxapi.WXPayEntryActivity
。
文章图片
微信回调的类.png
附上自己的类:
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端流程.png
2,发起微信支付
Android App 调起微信支付所需的参数如下,这里的参数绝大多数是上图流程中调用后台订单接口返回:
文章图片
调起微信支付所需要的请求参数 .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不对应造成的。
文章图片
微信支付的能力.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;
}
推荐阅读
- android第三方框架(五)ButterKnife
- 基于微信小程序带后端ssm接口小区物业管理平台设计
- Android中的AES加密-下
- 带有Hilt的Android上的依赖注入
- 员工的微信朋友圈是公司的宣传阵地吗()
- android|android studio中ndk的使用
- FBI怎么和恐怖分子谈判
- Android事件传递源码分析
- RxJava|RxJava 在Android项目中的使用(一)
- Android7.0|Android7.0 第三方应用无法访问私有库