解决:微信支付坑多?其实很简单!在WXPayEntryActivity回调方法中向后台验证支付结果,但获取不到OrderID,下面几种办法应该可以解决。

如标题,好久没做微信支付,之前的坑忘了,今天又遇到,记下来供朋友们参考,话不多说,先大致简单的介绍一下集成微信支付的流程,就几行字的事,希望朋友们有点耐心。

 

  • 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;
            }
        }
    }

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不强何以成标杆

有钱捧个钱场,没钱捧个人场奥

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值