解决:微信支付坑多?其实很简单!在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;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.微信支付返回来过渡的页面/支付结果页也凑合);api = WXAPIFactory.createWXAPI(this, Constants.WX_KEY);api.handleIntent(getIntent(), this);}@Overrideprotected void onNewIntent(Intent intent) {super.onNewIntent(intent);setIntent(intent);api.handleIntent(intent, this);}@Overridepublic void onReq(BaseReq baseReq) {}@Overridepublic 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() 整个的代码你瞅瞅?
@Overridepublic 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;}}}
解决:微信支付坑多?其实很简单!在WXPayEntryActivity回调方法中向后台验证支付结果,但获取不到OrderID,下面几种办法应该可以解决。相关推荐
- [异常解决] ubuntu上安装虚拟机遇到的问题(vmware坑了,virtual-box简单安装,在virtual-box中安装精简版win7)
[异常解决] ubuntu上安装虚拟机遇到的问题(vmware坑了,virtual-box简单安装,在virtual-box中安装精简版win7) 参考文章: (1)[异常解决] ubuntu上安装虚 ...
- Python很简单?学会魔术方法才算入门!
永久地址:http://www.ssforce.cn/?p=289 Python中的元类是什么? 原问题地址:http://stackoverflow.com/questions/100003/wha ...
- 解决微信小程序数据渲染缓慢或卡顿的方法
在微信小程序中渲染数据时通常会使用setData方法,但是setData对数据是有影响的,单次设置的数据不能超过1024kB,否则就会出现卡顿甚至有时会导致小程序闪退等现象,而我们在实现上拉加载分页数 ...
- 查看oracle压力,一个很简单测试oracle压力方法
今天做了一个简单的测试数据库压力,把东西分享了一下. 服务器情况: 操作系统版本:CentOS 5.6 -64 cpu:Intel(R) Xeon(R) CPU X5660 @ 2.80GHz * ...
- su密码忘了,很简单的搞定方法
zesi111 2013-07-20 10:07:28 4601 收藏 3 文章标签: su 密码 忘了 丢失 su密码忘记了重新设置: 非常简单,下面是设置的方法: me@tipfoo:~$ sud ...
- 视频分割很简单,教你方法三分钟搞定视频剪辑
很多朋友不知道怎么分割视频,今天小编就分享怎么在电脑上分割视频的方法,使用媒体梦工厂操作起来不难,新手小白也能轻松学会,一起接着往下看吧. 第一步,开始剪辑之前,小编准备了多段视频用于演示分割效果,可 ...
- oppo手机语音转文字其实很简单,学会这个方法,一分钟搞定课堂笔记
九月开学季,同学们也纷纷返校投入学习中,但迎面而来的是听不完的讲座和记不完的笔记,而讲座老师尤其喜欢口述重点,记录长时间手不仅酸的要死,而且还会因为疲劳而造成错记漏记重点的情况,其实我们利用oppo手 ...
- 远程计算机凭据不对,三种办法助你解决远程桌面提示“您的凭据不工作”的问题...
随着电脑的使用率越来越高,我们可能会遇到远程桌面提示"您的凭据不工作"的问题,要怎么处理呢?详细解决方法如下: 方法一:组策略编辑器设置身份验证 1.打开组策略编辑器. 找到开始- ...
- ListView加载图片错位的问题,解决很简单
能看到这片文章,相信你遇到了ListView获取RecycView加载数据,产生了错乱的情况, 最近项目遇到,需要动态根据服务器返回的图片链接,动态生成图片,并显示的问题, 结果就出现了图片错兰的问题 ...
最新文章
- 2020年, VQA论文汇总
- CG CTF WEB 综合题
- MYSQL 更改数据库data存储目录 创建用户 创建权限 设置远程访问的权限.
- Vue.config.productionTip = false
- SAP UI5 ComponentBase createMetaData signature - why is MD hard coded
- 异步加载js文件并执行js方法:实现异步处理网页的复杂效果
- equals, hashCode, toString方法重写,深入探究equals
- python中异常和错误是同一个概念吗_Python 错误与异常
- C语言基础知识整理(选择结构)
- 互联网产品经理喜欢的内容,连张小龙都主动加微信的男人写的
- 向Spark集群提交任务
- Exchange 2007 SP1 SCR
- 【jiasuba】教你快速更改系统图标大小
- Spring-cloud学习教程视频
- Windows安装numpy详细教程
- 分析2022年新型传播的.360后缀勒索病毒与数据恢复案例
- 【英特尔杯】Python调取萤石网络摄像头视频
- 中标麒麟桌面版7.0(NeoKylin linux desktop release 7.0)配置pyqt5运行环境说明
- 2021世界量子计算机排名,2021 QS世界大学学科排名如期出炉啦!
- Ubuntu 设置静态IP
热门文章
- 数睿数据深度 | 关于软件自主可控,源代码向左,无代码向右
- 使用threejs导入外部模型与滑动查看【微信小程序】-裁-
- Ubuntu16.04中鼠标左右键功能相反
- GB/T 36624-2018《可鉴别的加密机制》笔记——5. 机制4:加密+MAC
- EBC-B10电池容量测试仪之通信协议分析
- MySQL,刷题之对完整性约束操作,题+代码!!
- div+css静态网页设计 电商购物网站设计(55页) 电商网页设计制作 简单静态HTML网页作品 购物网页作业成品 学生商城网站模板
- linux系统视频软件,腾讯视频Linux版下载
- python-检查网站更新
- k8s dashboard安装