项目集成微信支付,折腾了三天左右,坑太多,做个简单记录
开通和主要原理不再讲了,参考微信支付官网
截个官网的业务流程图,下面好说明
1 支付结果回调(图中的17步)
支付结果回调,微信官方的说法是:
在net.sourceforge.simcpux.wxapi包路径中实现WXPayEntryActivity类(包名或类名不一致会造成无法回调),在WXPayEntryActivity类中实现onResp函数,支付完成后,微信APP会返回到商户APP并回调onResp函数,开发者需要在该函数中接收通知,判断返回错误码,如果支付成功则去后台查询支付结果再展示用户实际支付结果。注意一定不能以客户端返回作为用户支付的结果,应以服务器端的接收的支付通知或查询API返回的结果为准。
(1) 其实正确地写法是appPackageName.wxapi. WXPayEntryActivity(如:com.example.app.wxapi. WXPayEntryActivity),而且类名必须是这个名字,要不不能回调(这个问题好网上遇到的人很多)。
(2) 还有一个问题,, AndroidManifest.xml配置文件中配置WXPayEntryActivity类时,要加上android:exported="true"这个标签,不然也回调不到,这个坑了我一个多小时;
2 android端请求签名(图中第9步)
微信官网的说法是:
签名生成的通用步骤如下:
第一步,设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。
特别注意以下重要规则:
◆ 参数名ASCII码从小到大排序(字典序);
◆ 如果参数的值为空不参与签名;
◆ 参数名区分大小写;
◆ 验证调用返回或微信主动通知签名时,传送的sign参数不参与签名,将生成的签名与该sign值作校验。
◆ 微信接口可能增加字段,验证签名时必须支持增加的扩展字段
第二步,在stringA最后拼接上key得到stringSignTemp字符串,并对stringSignTemp进行MD5运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。
通俗的说,请求的参数做签名, appid,noncestr ,package,partnerid,prepayid,timestamp 按这个顺序(注意必须是小写),键值对的格式(即key1=value1&key2=value2…)做签名。
3 支付结果返回-1(图中的17步)
微信官网的说明是:
开放平台配置的包名和应用签名是否一致:(android);确认是否使用正式的keystore打包apk并安装调试;(android);提交订单部分需要在服务器端完成。
(1)应用签名问题:
微信开发平台申请开发应用时:
填写Android平台的应用签名时,需要注意,填写的是keystore的MD5值,不是SHA1值。注意开发时的debug.keystore和最终发布的签名keystore的MD5,SHA1都是不一样的。正式发布产品需要使用正式的签名。
另外特别注意:md5值得填写全是小写,并且不能包含冒号。
(2)注册app到微信
除过微信开发Demo里面的注册,在每次向微信服务器请求数据之前再注册一次
wxApi.registerApp(Constants.APP_ID); //发送请求数据之前再注册一次
wxApi.sendReq(req);