这几天给app对接了微信支付,官方的demo真是。。。第一次果然不免爬几个坑,记录一下,避免遗忘。
错误说明
在保证提供的参数都正确的情况下,往往测试微信支付失败的原因是签名错误,这个时候应该仔细核对流程。就我自己而言碰到的问题就是搞错了最后发送订单的时候的签名sign参数。这个签名不是第一次组拼的签名,也不是生成预支付交易单,获取prepayId时返回的签名,而是获取到prepayId后用prepayId和其他参数第二次组拼成的sign。
流程说明
详细的业务流程为微信官方文档里有,我这边以所有参数由客户端提供的方式简单说明一下请求流程。
获取必须参数,第一次签名。
需要说明的是签名中的key参数是由我方自行在微信商户平台设置的。具体位置:微信商户平台(pay.weixin.qq.com)-->账户设置-->API安全-->密钥设置
生成预支付交易单,获取prepayId。
调用微信的接口“https://api.mch.weixin.qq.com/pay/unifiedorder”获取prepayId。另外返回信息中的sign并不是最后调起支付中的sign参数。
第二次签名。
用"appid","noncestr","package","partnerid","prepayid","timestamp"生成第二次签名。签名方式与第一次相同,参数不同(注意参数顺序)。这样就拿到了调起微信支付所需的所有参数。
调起微信支付。
代码说明
public class WXPayUtils {
private Context mContext;
private PayReq req;
private IWXAPI iwxapi; //微信支付api
private Map resultunifiedorder;
public WXPayUtils() {
}
public WXPayUtils(Context context) {
this.mContext = context;
req = new PayReq();
iwxapi = WXAPIFactory.createWXAPI(context, null); //初始化微信api
}
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 0: //获取参数及调起支付
getPayParameter();
sendPayReq();
break;
default:
break;
}
}
};
/**
* 第一次签名及生成prepayId
**/
public void toWXPayAndSign(int money) {
PrePayIdAsyncTask prePayIdAsyncTask = new PrePayIdAsyncTask();
prePayIdAsyncTask.execute(money);
}
private class PrePayIdAsyncTask extends AsyncTask> {
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
}
@Override
protected Map doInBackground(Integer... params) {
// TODO Auto-generated method stub
String urlString = "https://api.mch.weixin.qq.com/pay/unifiedorder";
in