如标题,好久没做微信支付,之前的坑忘了,今天又遇到,记下来供朋友们参考,话不多说,先大致简单的介绍一下集成微信支付的流程,就几行字的事,希望朋友们有点耐心。
- Step1. 在微信开放平台上下载微信的SDK,然后扔到你的项目里,并添加上依赖;
- Step2. 在你准备请求微信支付的Activity里,先注册一下子微信支付SDK,然后调用就行了;
这是注册奥:
private IWXAPI api;
api = WXAPIFactory.createWXAPI(context, null);
api.registerApp("你的App id");
这就是调用了:
PayReq req = new PayReq();
//req.appId = "wxf8b4f85f3a794e77"; // 测试用appId
req.appId = json.getString("appid");
req.partnerId = json.getString("partnerid");
req.prepayId = json.getString("prepayid");
req.nonceStr = json.getString("noncestr");
req.timeStamp = json.getString("timestamp");
req.packageValue = json.getString("package");
req.sign = json.getString("sign");
// 在支付之前,如果应用没有注册到微信,应该先调用IWXMsg.registerApp将应用注册到微信
api.sendReq(req);
- Step3. ※ 完了在你项目的根目录,就是 “com.xx.xx” 那里面建个文件,名叫 “wxapi” ,然后在里面建个Activity,名叫 “WXPayEntryActivity” 并集成 “IWXAPIEventHandler” 接口。这里所有的名字必须按引号里的写奥,写错了不好使可赖不着别人。
- Step4. 到这步了,就搞一下“WXPayEntryActivity” ,下面代码直接复制进就OK,如有报错简单改一下就行,别嫌费劲奥!
private IWXAPI api;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.微信支付返回来过渡的页面/支付结果页也凑合);
api = WXAPIFactory.createWXAPI(this, Constants.WX_KEY);
api.handleIntent(getIntent(), this);
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
api.handleIntent(intent, this);
}
@Override
public void onReq(BaseReq baseReq) {
}
@Override
public void onResp(BaseResp baseResp) {
if (baseResp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
// 判断一下子微信支付成功没成功,就3个返回值
switch (baseResp.errCode) {
case 0:
// 成功 - 成功之后需要跑一下后台接口,验证是否真的支付成功
requestCheckWechatPayResult();
break;
case -1:
// 错误
ToastUtil.getInstance()._short(this, baseResp.errStr);
break;
case -2:
// 用户取消
ToastUtil.getInstance()._short(this, "取消支付");
break;
}
}
}
- Step5. 上你项目的Manifest里注册一下这个Activity,就完事了,跑程序吧!
※ Ps. 重要的事情说一遍,如果你手机里没安装微信,按照这5步弄完,会提示3个错误,并且没有反应,这个时候就需要注意了奥!
接下来大概说一下几个在WXPayEntryActivity获取OrderID用来显示或跑后台接口用的办法:
-
方法一:※ 肯定好使的方法,但比较大众化而且比较Low —— SharedPreference
就是在你请求微信支付接口前,肯定得先跑后台给你的接口吧?那个时候是不是给你返回了OrderID?什么?没返回?找后台去!以下说的是返回了OrderID的情况:
在你请求微信支付接口前,把后台返回的OrderID存到本地SharedPreference里,然后在WXPayEntryActivity的回调方法onResp() 里取出来这个OrderID,然后再进行下一步操作,操作完了,把这个OrderID干掉,省得到时候存多了搞混了。
-
方法二:稍微高级点的方法,用EventBus 黏性事件,这个就不多说了,在你获取到OrderID的时候给它按黏性事件发送走,完了接收的地方注册一下EventBus,直接取就OK了。但是一定要记得,要注销EventBus的黏性事件!
-
方法三:再高级点的办法,用自定义接口转接,俗称嫁接的办法,把微信支付回调的结果转接到其他Activity,并进行操作。(这种方法朋友说的,没试过,理论上可行,如有机会可以试试。)
-
方法四:神奇脑洞的办法,用推送,不走微信支付结果回调了,微信支付完成后,返回商户跳转时,估计你就能收到推送了,因为 —— 经测试,后台收到微信的支付结果要快于前端收到微信的支付结果,然后这时候根据推送的结果来跳转展示微信支付结果页面。(但这种方法容易出现纰漏,万一推送没好使呢,万一推送让人屏蔽了呢,万一xxx)
-
方法五:※※ 最靠谱的最简单的最高大上的办法来了,话不多说,看代码:
PayReq req = new PayReq();
req.appId = dataBean.getAppId();
req.partnerId = dataBean.getMchId();
req.prepayId = dataBean.getPrepayId();
...
// 就是这个微信官方文档里没介绍的参数,百度上查,作用为:未知 的参数!
req.extData = dataBean.getOrderId();
api.sendReq(req);
说白了,就是拿这个 extData 参数来传 OrderID ,然后在WXPayEntryActivity里的回调方法中,这么搞一下子:
// 这两行代码决定了这个OrderID是咋带过来的
PayResp resps = (PayResp) baseResp;
String orderId = resps.extData;
这OrderID就获取到了,不信你试试?
贴个onResp() 整个的代码你瞅瞅?
@Override
public void onResp(BaseResp baseResp) {
if (baseResp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
PayResp resps = (PayResp) baseResp;
String orderId = resps.extData;
switch (baseResp.errCode) {
case 0:
// 成功 - 成功之后跑一下后台 验证是否真正支付完成 接口
requestCheckWechatPayResult(orderId);
break;
case -1:
// 错误
ToastUtil.getInstance()._short(this, baseResp.errStr);
break;
case -2:
// 用户取消
ToastUtil.getInstance()._short(this, "取消支付");
break;
}
}
}