讲道理,微信支付确实做过好多次了。但是我却没有正八经的梳理过流程
最近算是被坑了。在次记录
- 微信开发者平台申请appId ,这个无需多言。
- 在 .wxapi包下放入 WXPayEntryActivity.class;用来接收回调结果,别忘了在AndroidManifest清单文件中注册 。
- 调起支付接口:
首先第一点,将价格和ip传给服务器。获取服务器返回的一系列值 :
appId、partnerId、prepayId、nonceStr、timeStamp、
packageValue为固定值 “Sign=WXPay”;
我的坑就是在接下来,因为我们还要向服务器传递一个sign .然后这个sign值是需要将之前的几个值拼起来,然后在和商户秘钥拼接起来,我们一起的做法都是服务器拼接起来,返给我们然后直接传递给微信。然而这一次我却栽在了这里,我这边这个后台是个新手,而且你说话他都随便应付你。我反复问他sign是不是,拼接起来的。他说是。然后我就没有多管,然而就是调不起微信支付。然后我自己也拼接了一遍。确实也没调起来。后来我重启手机,又调用了一次。成功了。然后在问后台,他又给我说他以为微信服务器给拼接了。
无语中啊。。。。
其实支付的大部分功能都在服务器端。后台把我们的数据提交给微信服务器, 还是需要在把数据拼接一个sign前面的。
终端需要注意的 :
1 .核对是否是打包好的签名 和我们填写的包名
2. appId 注意是否写正确了
3. WXPayEntryActivity.class的位置。一定是在 .wxapi包下。
4. 别忘了在清单文件中注册回调activity
5. 这个sign签名,我是在再不用后台给我拼了。自己搞
调起支付及sing拼接代码
IWXAPI api = WXAPIFactory.createWXAPI(this, "***********", false);
api.registerApp("***********");
WxEntity.DataBean data = wxEntity.getData();
PayReq payReq = new PayReq();
payReq.appId = data.getAppId();
payReq.partnerId = data.getMchId();
payReq.prepayId = data.getPrePayId();
payReq.nonceStr = data.getNonceStr();
payReq.timeStamp = data.getTimestamp();
payReq.packageValue = "Sign=WXPay";
// payReq.sign = data.getSign();
String stringA =
"appid=" + data.getAppId()
+ "&noncestr=" + data.getNonceStr()
+ "&package=" + "Sign=WXPay"
+ "&partnerid=" + data.getMchId()
+ "&prepayid=" + data.getPrePayId()
+ "×tamp=" + data.getTimestamp();
String stringSignTemp = stringA + "&key=" + "aqkdlpondbzSkpNdopMMqaHJKLpoKjLm";
String sign = MD5.getMessageDigest(stringSignTemp.getBytes()).toUpperCase();
Log.i("Sign-->", sign);
payReq.sign = sign;
api.sendReq(payReq);
WXPayEntryActivity .class
public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler {
private static final String TAG = "MicroMsg.SDKSample.WXPayEntryActivity";
private IWXAPI api;
public static final int ERRCODE_OK = 0; //支付成功的返回码
public static final int ERRCODE_NO = -1; //支付失败的
public static final int ERRCODE_CANCEL = -2; //用户取消支付
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.pay_result);
//这里填写自己的APPID
api = WXAPIFactory.createWXAPI(this, "wxb872a94f23cc21a0");
api.handleIntent(getIntent(), this);
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
api.handleIntent(intent, this);
}
@Override
public void onReq(BaseReq req) {
}
@Override
public void onResp(BaseResp resp) {
//在这个方法中接收回调
Log.i("TAG", "PayResult-->" + resp.errCode);
String s = "";
switch (resp.errCode) {
case ERRCODE_OK://支付成功的返回码
EventBus.getDefault().post(new WxPaySuccessEntity(true));
break;
case ERRCODE_NO: //支付失败的
s = "支付失败";
break;
case ERRCODE_CANCEL://用户取消支付
s = "取消支付";
break;
}
// BxUtil.showMessage(WXPayEntryActivity.this, s);
finish();
}
}