#Android微信支付接入(三步完工解析+实例)
最近有朋友问到微信支付的一些开发点,博主就把微信支付接入流程,捋一捋.基本初入安卓的也能根据本文,快速接入微信支付.默认读者具备签名打包知识(如不具备请先查阅相关知识点)
参照博主提供例子,按照下文即可快速简单接入微信支付,给需要的读者直接上的安卓微信支付Demo
文章目录
一 公司官方注册微信开放平台账号(准备1)
第一步:开发者第一点注意贵公司是否已申请微信开放平台账号( 微信目前只支持公司账号申请支付,暂不支持个人开发者支付申请),没有则协调沟通申请即可.
二 登录微信开放平台创建移动应用(准备2)
-
:登录账号后,点击上面菜单栏 [管理中心] – [移动应用]–[创建应用],创建应用三个步骤按提示填入(审核后这部分资料可修改),微信会在7天内完成审核.记录好AppID与AppSecret后面使用即可.
注:博主那时负责安卓端与IOS端这块由我申请的,微信支持两端一起创建即可(这里踩过坑,读者注意)
-
安卓需要配置应用签名 :打一个release包,安装即可,在安装一个微信自己的获取签名APK,在该APK输入,刚才release包名,即可生成应用签名,绿色字体既是应用签名 (微信采用安全码策略:包名+应用名+应用签名,只要一个改变,就无法调起微信支付)
微信官方截图如下:
三 微信支付接入(核心代码)
1.在app的build.gradle文件中,添加如下依赖:
dependencies {
compile 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+'
}
2.在注册清单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"/>
3.在应用入口MyApplication中将该app注册到微信即可
final IWXAPI msgApi = WXAPIFactory.createWXAPI(context, null);
// 将该app注册到微信 AppID:步骤二申请到的AppID
msgApi.registerApp(AppID);
4.接受后台返回支付信息:在APP支付发起页面,向后台服务器请求,服务器生成预付单,返回response 成功,获取到prepay_id等相应参数,app再调起微信支付即可
/**
* 微信支付
*/
public void payToWX() {
StringBuilder url = new StringBuilder();
url.append(Constants.GET_WX_PARAMETER);
url.append("?Token=" + PreferencesUtils.getString(this, Constants.TOKEN_KEY));
url.append("&orderNum=" + orderBean.getOrderNumber());
HttpUtils.post(url.toString(), new HttpCallBack() {
@Override
public void onBefore(BaseRequest request) {
super.onBefore(request);
showDialog("加载中...");
}
@Override
public void onSuccess(String s, Call call, Response response) {
InfoResultData infoResultData = new Gson().fromJson(s, InfoResultData.class);
if (infoResultData.getStatus() == 200) {
goToWX(infoResultData.getData().toString());
} else {
disDialog();
showShort(infoResultData.getMessage());
}
}
@Override
public void onError(Call call, Response response, Exception e) {
super.onError(call, response, e);
disDialog();
}
});
}
5,调起原生微信支付:把服务器返回的,字典封装并提交给微信即可mWxApi.sendReq(req);
/**
* 前往微信页面支付
*/
public void goToWX(String json) {
// 可以在当前页面注册,或者前面APP 注册
IWXAPI mWxApi = WXAPIFactory.createWXAPI(this, Constants.WX_APPID, true);
mWxApi.registerApp(Constants.WX_APPID);
if (mWxApi != null) {
PayReq req = new PayReq();
req.appId = Constants.WX_APPID;// 微信开放平台审核通过的应用APPID
try {
JSONObject jsonObject = new JSONObject(json);
req.partnerId = jsonObject.getString("partnerid");// 微信支付分配的商户号
req.prepayId = jsonObject.getString("prepayid");// 预支付订单号,app服务器调用“统一下单”接口获取
req.nonceStr = jsonObject.getString("noncestr");// 随机字符串,不长于32位咱生成
req.timeStamp = jsonObject.getString("timestamp");// 时间戳
req.packageValue = jsonObject.getString("package");// 固定值Sign=WXPay,服务器返回固定值
req.sign = jsonObject.getString("sign");// 签名
} catch (JSONException e) {
e.printStackTrace();
}
mWxApi.sendReq(req);
}
}
6.支付成功:在WXPayEntryActivity页面接收微信支付结果回调,做自己相应需求即可
@Override
public void onResp(BaseResp resp) {
//0成功 -1支付出错 -2用户取消支付
//-1支付出错可能的原因:签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、其他异常等
if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
//支付成功 TODO
}
}
注:踩过的坑–测试debug签正式签名即可调起(同release发布版一样操作即可)
四 服务端坑点
-
坑点一:服务端key,是微信商户平台,在账户设置,API安全,秘钥设置里面设置(这个坑我们后台接入时踩过)
-
坑点二: 服务端返回数据需要带上商户IDpartnerId(我们后端估计没仔细看文档)
-
坑点三: 服务端几个相关id,现在都是小写,请仔细看官方文档是id不是Id(最后直接 C + V保证一致)
五 尾言
希望读者看完上面文章即可简单快速接完微信支付,下面是官方链接
六 微信返回-1终极处理补充(20190712)
返回-1请注意:你已经确认你包名,签名等所有配置没问题,清空微信缓存,或者卸载微信缓存。
开发时场景:debug 与 release签名切换后,导致返回-1,不能正常调起微信支付。这个是微信的一个bug也是一个坑,个人理解微信把包名和签名存储起来了,后面不更新,导致切换签名后,不能正常覆盖,而最终不能吊起支付。
再说3次:卸载,卸载,卸载 即可
补充–调不起微信支付原因
注意包名,在xx.xxxxxx.xxxx.wxapi包路径中实现WXPayEntryActivity类(包名或类名不一致会造成无法回调)
build文件配置:applicationIdSuffix 包名尾缀