用了2天的时间才把微信支付弄明白到底怎么回事,不容易啊。
先听我絮叨一下微信支付的具体流程:
1.APP用户请求web url,这个url会去“微信商户平台”统一下订单。
2.下单以后返回一些数据,根据返回的数据,再去"微信APP"启动支付。
这其中涉及了3个sign(也叫签名的东西)。如果不知道签名的规则请:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=4_3 查看
第一个sign: 用户去“微信商户平台下单” 参数封装成一个xml,其中sign参数为:MD5(所有参数排序后+ key=微信商户平台的密钥)。
第二个sign: “微信商户平台”下单后,返回的sign,用于自己平台上对于微信返回的数据做校验。千万不要拿这个sign去启动“微信APP”支付(要不然就出提示:errCode = -1 的错误)。
第三个sign:需要把下单成功后的参数,按照特定的规则排列,这个规则就是,看下图:
参数名和参数值都不能错,必须是这样的 。然后根据 appid,partnerid,prepayid,package,noncestr,timestamp进行签名(sign)签名的规则为:MD5(这6个参数排序后+ key=微信商户平台的密钥)。加入sign参数后,再去加入其他参数。然后你的安卓APP根据获取到的参数来启动微信支付。(否则也会出现 errCode = -1 的错误)。
errCode -1:签名错误,所说的签名就是第三个sign。当然还有APPID未通过,和APPID注册的和返回的不一样,这个是“微信开放平台”里的东西。
所以说,如果看到3个sign都是不一样的前往不要吃惊。
APP代码比较简单如下:
public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
api = WXAPIFactory.createWXAPI(this, appid,false);
api.registerApp(appid);//注册appid
api.handleIntent(getIntent(), this);
Pay();
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
api.handleIntent(intent, this);
}
private void Pay(){
new Request().get(url, new Callback() {//发起web请求
@Override
public void finished(final String result) {
if (null != result) {
final Map map = gson.fromJson(result, Map.class);
if ("SUCCESS".equalsIgnoreCase((String) map.get("return_code"))) {
api.registerApp((String) map.get("appid"));
PayReq req = new PayReq();
req.appId = (String) map.get("appid");
req.partnerId = (String) map.get("partnerid");
req.prepayId = (String) map.get("prepayid");
req.packageValue = (String) map.get("package");
req.nonceStr = (String) map.get("noncestr");
req.timeStamp = (String) map.get("timestamp");
req.sign = (String) map.get("sign");
api.sendReq(req);
} else {
Log.e("error-->", "FAIL");
}
} else {
Log.e("error-->", "REQUEST FAIL");
}
}
});
}
@Override
public void onReq(BaseReq baseReq) { }
@Override
public void onResp(BaseResp baseResp) {
if (baseResp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
//支付成功
}else{
//支付失败
}
}
}
如果出现微信支付成功但是未回调,onResp方法,请检查包名是否正确,微信支付和微信分享的回调必须如下图:
这种目录结构才行。同时还要修改AndroidManifest.xml文件如下图:
请注意: android:exported="true"。还要注意代码里要有这2句如下图:
其他的应该都有返回错误的提示信息,都好解决。