一、Android微信支付集成,准备工作
1,微信开放平台 注册,获取App id等信息
注册过程中填写相应的信息即可,需要注意应用签名的获取。
应用签名获取步骤:
-
找到自己项目的签名文件,比如我的存放在项目中,如下图:
- 打开命令提示框,输入
keytool -v -list -keystore 路径
,输入密码后会显示出jks信息,例如:
注意:这里的MD5就是需要的,将中间的 : 删除,就是应用签名,也可以通过微信的一个工具apk,来获取微信应用签名获取apk下载 ,可以通过该工具对比 上面的MD5,是否一致!应用信息填写完毕,然后提交申请即可。
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
。
注:微信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端与后台交互的大致流程如下:
2,发起微信支付
Android App 调起微信支付所需的参数如下,这里的参数绝大多数是上图流程中调用后台订单接口返回:
后台返回数据后,调起微信支付的代码如下:
/**
* 调支付的方法
*
* 注意: 每次调用微信支付的时候都会校验 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以后,注意监测是否获得微信支付的能力,需要单独申请
微信支付中,如果报appid和mech_id(微信支付分配的商户号)的错,应该就是要支持支付功能的App的appid与商户平台的商户id不对应造成的。
附:检测是否安装微信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;
}