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

  • 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,下面几种办法应该可以解决。相关推荐

  1. [异常解决] ubuntu上安装虚拟机遇到的问题(vmware坑了,virtual-box简单安装,在virtual-box中安装精简版win7)

    [异常解决] ubuntu上安装虚拟机遇到的问题(vmware坑了,virtual-box简单安装,在virtual-box中安装精简版win7) 参考文章: (1)[异常解决] ubuntu上安装虚 ...

  2. Python很简单?学会魔术方法才算入门!

    永久地址:http://www.ssforce.cn/?p=289 Python中的元类是什么? 原问题地址:http://stackoverflow.com/questions/100003/wha ...

  3. 解决微信小程序数据渲染缓慢或卡顿的方法

    在微信小程序中渲染数据时通常会使用setData方法,但是setData对数据是有影响的,单次设置的数据不能超过1024kB,否则就会出现卡顿甚至有时会导致小程序闪退等现象,而我们在实现上拉加载分页数 ...

  4. 查看oracle压力,一个很简单测试oracle压力方法

    今天做了一个简单的测试数据库压力,把东西分享了一下. 服务器情况: 操作系统版本:CentOS 5.6 -64 cpu:Intel(R) Xeon(R) CPU  X5660  @ 2.80GHz * ...

  5. su密码忘了,很简单的搞定方法

    zesi111 2013-07-20 10:07:28 4601 收藏 3 文章标签: su 密码 忘了 丢失 su密码忘记了重新设置: 非常简单,下面是设置的方法: me@tipfoo:~$ sud ...

  6. 视频分割很简单,教你方法三分钟搞定视频剪辑

    很多朋友不知道怎么分割视频,今天小编就分享怎么在电脑上分割视频的方法,使用媒体梦工厂操作起来不难,新手小白也能轻松学会,一起接着往下看吧. 第一步,开始剪辑之前,小编准备了多段视频用于演示分割效果,可 ...

  7. oppo手机语音转文字其实很简单,学会这个方法,一分钟搞定课堂笔记

    九月开学季,同学们也纷纷返校投入学习中,但迎面而来的是听不完的讲座和记不完的笔记,而讲座老师尤其喜欢口述重点,记录长时间手不仅酸的要死,而且还会因为疲劳而造成错记漏记重点的情况,其实我们利用oppo手 ...

  8. 远程计算机凭据不对,三种办法助你解决远程桌面提示“您的凭据不工作”的问题...

    随着电脑的使用率越来越高,我们可能会遇到远程桌面提示"您的凭据不工作"的问题,要怎么处理呢?详细解决方法如下: 方法一:组策略编辑器设置身份验证 1.打开组策略编辑器. 找到开始- ...

  9. ListView加载图片错位的问题,解决很简单

    能看到这片文章,相信你遇到了ListView获取RecycView加载数据,产生了错乱的情况, 最近项目遇到,需要动态根据服务器返回的图片链接,动态生成图片,并显示的问题, 结果就出现了图片错兰的问题 ...

最新文章

  1. 2020年, VQA论文汇总
  2. CG CTF WEB 综合题
  3. MYSQL 更改数据库data存储目录 创建用户 创建权限 设置远程访问的权限.
  4. Vue.config.productionTip = false
  5. SAP UI5 ComponentBase createMetaData signature - why is MD hard coded
  6. 异步加载js文件并执行js方法:实现异步处理网页的复杂效果
  7. equals, hashCode, toString方法重写,深入探究equals
  8. python中异常和错误是同一个概念吗_Python 错误与异常
  9. C语言基础知识整理(选择结构)
  10. 互联网产品经理喜欢的内容,连张小龙都主动加微信的男人写的
  11. 向Spark集群提交任务
  12. Exchange 2007 SP1 SCR
  13. 【jiasuba】教你快速更改系统图标大小
  14. Spring-cloud学习教程视频
  15. Windows安装numpy详细教程
  16. 分析2022年新型传播的.360后缀勒索病毒与数据恢复案例
  17. 【英特尔杯】Python调取萤石网络摄像头视频
  18. 中标麒麟桌面版7.0(NeoKylin linux desktop release 7.0)配置pyqt5运行环境说明
  19. 2021世界量子计算机排名,2021 QS世界大学学科排名如期出炉啦!
  20. Ubuntu 设置静态IP

热门文章

  1. 数睿数据深度 | 关于软件自主可控,源代码向左,无代码向右
  2. 使用threejs导入外部模型与滑动查看【微信小程序】-裁-
  3. Ubuntu16.04中鼠标左右键功能相反
  4. GB/T 36624-2018《可鉴别的加密机制》笔记——5. 机制4:加密+MAC
  5. EBC-B10电池容量测试仪之通信协议分析
  6. MySQL,刷题之对完整性约束操作,题+代码!!
  7. div+css静态网页设计 电商购物网站设计(55页) 电商网页设计制作 简单静态HTML网页作品 购物网页作业成品 学生商城网站模板
  8. linux系统视频软件,腾讯视频Linux版下载
  9. python-检查网站更新
  10. k8s dashboard安装