场景
最近新的App要集成微信支付,因为知道微信支付的坑比较 多,虽然之前的App集成过微信支付,但是挪过照搬过来的时候还是小心翼翼的,可结果还是不尽如人意啊,偏偏遇到了ios提示签名错误,Android 调用微信白屏并且errCode=-1的结果,根据微信官方对该code的解释,我们Android、ios两端和后台来来回回核对了好几遍签名、APPID和后台订单参数的处理,仍然没有任何的头绪,经过一天多的各种查找测试,后台同事一声大骂,发现了拷贝的微信官方java文件WXPAY.java里关于sign加密类型处理的判断才是根源所在。,代码如下:
if (useSandbox) {
this.signType = SignType.MD5;
} else {
this.signType = SignType.HMACSHA256;
}
其他博文普遍提到的微信支付的坑
- APPID是否和微信开放平台申请的一致。
- 后台设置的签名是商户平台设置的密钥。
- WXPayEntryActivity.java和wxapi包拷贝到项目的文件夹的位置是否正确。
- 在Manifest中是否声明了WXPayEntryActivity类,如代码:
<activity
android:name=".wxapi.WXPayEntryActivity"
android:exported="true"
android:launchMode="singleTop"/>
客户端调用微信的判断
关于客户端调用微信的方法,微信官方文档也没有说明,大多数的博文也是一笔带过,如下代码:
final String APPID = "wxd930ea5d5a258f4f";
IWXAPI msgApi = WXAPIFactory.createWXAPI(context, APPID, false);
msgApi.registerApp(APPID);
if (!msgApi.isWXAppInstalled()) {
Toast.makeText(this, "未安装微信",Toast.LENGTH_SHORT).show();
} else if (!msgApi.isWXAppSupportAPI()) {
Toast.makeText(this, "当前微信版本不支持支付",Toast.LENGTH_SHORT).show();
} else {
}
在测试支付的时候发现,在不是最新版本的微信上,虽然API的isWXAppSupportAPI()判断提示当前微信版本不支持支付,但是实际却可以调用起来微信进行支付,因此我只采用了isWXAppInstalled()方法判断,如果安装了则直接调用微信进行支付。
在IOS上,多数厂商的App采用的是先调用API的openWXApp()方法,然后调用微信支付。