[TOP]
微信支付,说实话,做这个没有趟过水,踩过坑,三分钟搞定的还真没几人,简单是简单,但是…. 写官方文档的人比较懒,挖了不少坑!那么,我就写个3分钟上手的文章,就三分钟!

集成APP支付

一、下载SDK(当前最新3.1.1)和官方DEMO

二、集成支付环境

* 将jar包加到工程中,将demo中的WXPayEntryActivity.java 复制到自己工程中,注意了,要保持全包路径,也就是说你自己要建个 工程包名.wxapi这样的包路径,如下图,如然,别忘了在androidmainfest中注册这个activity. *


这样就算完成了集成支付环境了,剩下的就是操作api来完成支付功能

三、调起微信支付页面

 ** 首先来了解下APPID这玩意,这个是在开发者平台上创建应用时对应的一个appId,每个应用都是唯一的appId,关于创建应用     这一块,就没什么可讲的了**

步骤一:注册appId

    private IWXAPI msgApi;//操作各种功能的接口/*** 注册appId ,方式一:*/private void initWXAPI(){//参数二:注册的appId,参数三:是否验证appId,第三个参数可要可不要,不过还是指定为false吧msgApi = WXAPIFactory.createWXAPI(AwardActivity.this,ValueConstants.APP_ID,false);//msgApi = WXAPIFactory.createWXAPI(AwardActivity.this,ValueConstants.APP_ID);}/***注册appId,方式二:*/  private void initWXAPI(){msgApi = WXAPIFactory.createWXAPI(AwardActivity.this,null);msgApi.registerApp(ValueConstants.APP_ID);}

步骤二:调起支付页面

        if (msgApi.getWXAppSupportAPI() >= Build.PAY_SUPPORTED_SDK_INT) {PayReq request = new PayReq();request.appId =response.getString("appid");request.partnerId = response.getString("partnerid");request.prepayId= response.getString("prepayid");request.packageValue = "Sign=WXPay";request.nonceStr= response.getString("nonce_str");request.timeStamp= response.getString("timestamp");//这个sign参数一般是后台处理好后直接返回前端拿来用,但是也可以我们前端自己生成这个sign,//sign:把上面的参数按照首字母排序拼接,最后再加上申请的商户key,通边MD5加密后得到String str_sign="appid="+response.getString("appid")+"&"+"noncestr="+response.getString("nonce_str")+"&"+"package="+response.getString("package")+"&"+"partnerid="+response.getString("partnerid")+"&"+"prepayid="+response.getString("prepayid")+"&"+"timestamp="+response.getString("timestamp")+"&"+"key=saK23232323232323444ffddede";str_sign=MD5.getMessageDigest(str_sign.getBytes()).toUpperCase();request.sign= str_sign;MyLog.e("sign:"+str_sign);//这里打开支付页面msgApi.sendReq(request);}else{Toast.makeText(AwardActivity.this, "当前微信版本不支持支付功能", 0).show();}

四、支付完成

通过上面的步骤,就可以完成支付了,那么支付完了我们开发者怎么去拿到支付反馈信息呢,怎么进一步处理支付逻辑呢,还记得前面那个WXPayEntryActivity吗,是的,这个就是支付sdk完成支付会主动回调一个页面了,这也是为什么这个页面要按照定义好的包名来放的原因,那么,在这个类中,我们要做什么?

    private IWXAPI api;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.pay_result);api = WXAPIFactory.createWXAPI(this,ValueConstants.APP_ID);api.handleIntent(getIntent(), this);}@Overrideprotected void onNewIntent(Intent intent) {super.onNewIntent(intent);setIntent(intent);api.handleIntent(intent, this);}@Overridepublic void onReq(BaseReq req) {}// 0    成功  展示成功页面//-1    错误  可能的原因:签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、其他异常等。//-2    用户取消    无需处理。发生场景:用户不支付了,点击取消,返回APP。@Overridepublic void onResp(BaseResp resp) {MyLog.e("errCode = " + resp.errCode);Contants.payResult=resp.errCode;finish();}

是的,我们只需要关注这个onResp方法,通过resp.errCode去拿到支付结果0,-1,-2

* 注意了,msgApi.sendReq(request)后,不管微信的支付页面有没有调出来,最终都会来到这个WXPayEntryActivity页面 ,在这个页面,我们可以自己做一些事情,但是我这里就直接finish掉了,然后在调支付的页面这样处理的*

    @Overrideprotected void onResume() {// TODO Auto-generated method stubsuper.onResume();//调支付页面最好加个进度条,因为有时候很慢,造成无反应假像,然后在这里关闭。if (dialog!=null) {dialog.dismissProcessDialog();}if (contants.payResult==0) {setResult(RERESH);//去刷新前一个页面finish();}else if(NewMaterialApplication.getInstance().payResult==-1){Toast.makeText(this, "支付签名错误或appID未注册", 0).show();}else if(NewMaterialApplication.getInstance().payResult==-2){Toast.makeText(this, "已取消支付", 0).show();}}

当然通过这个支付返回码来判断是否真正支付成功是不正确的,最好要调后台的接口查一下是否真正支付成功了。

异常处理

很多小伙伴在玩这个支付的时候,100%会遇到返回 -1 这个错,我们来分析一下也就只有两种情况,
要么是appId有问题,要么是sign签名有问题
appId:
1、后台给你的有问题(首先自己登入开发者平台去看,不要相信后台人员说的)
2、误把公众号的appId拿来用了(有的人开发的时候有同时申请公众号)
3、sdk注册appId失败(这种情况没见过,但不排除)
sign:
后台返回的sign是不正确的(可以通过ios平台是否正常,或者像我上面那样自己签名),排除这个问题也不难,记住签名规则,保证key正确,最后还要注意一个地方,就是这个MD5加密方式,一定要用demo里的那个MD5类去加密,为什么呢,因为我就踩到这个坑里去了。很多有心得的朋友会说,出现 -1 清除下缓存啊,我想说,你不可能叫用户去清除下缓存吧,况且,清除缓存根本就没个鸟用!

这样就完美解决了 -1 这个坑了吗? NO,还有一种情况,那就是刚刚用工具debug安装到手机,然后跑了支付的功能,当然,这时候因为appId是用正式签名MD5码生成的,所以会返回 -1 ,然后你又换了个正式环境的,点破手机还是返回 -1 ,而且你确定之前正式包还是可以支付正常的,这时候你就蒙逼了,没错,这时候清下缓存这招就好使了,因为客户不可能会安装这个debug包的,所以,这种情况只会开发的时候出现!

微信支付之终级教程版,-1 问题全面分析相关推荐

  1. 微信支付生成签名和验签SDK源码分析

    目录 一.签名分析 1.1 流程分析 1.构造签名串 2.计算签名值 3.设置请求头 二.源码级别分析 二.获取平台证书分析 三.验签分析 3.1 验签使用场景: 3.2 验证流程: 1.获取微信平台 ...

  2. 微信支付官方SDK V3 .NET版的坑

    但是支付成功后却不能正确的执行支付结果js回调函数.看看其页面的点击事件是放在asp:Button上面的.我们知道在asp.net webform中,按钮的点击是有页面回调后台的.也就是其实点击了之后 ...

  3. 微信统一下单 java_微信支付之统一下单--JAVA版

    都说微信支付有些坑,都抱怨微信支付的文档太烂,一会APPId,一会商户id,还有appsecret,支付API秘钥让你傻傻分不清楚,还有这里大写那里小写,几种标准,让你眼花缭乱.没错,这就是很多技术团 ...

  4. 如何开通接入微信支付接口?(教程)

    个人进去     alywlzf.com 微信支付的使用用户越来越多,现在在超市餐厅都能使用微信支付就能付款了,那么商户开通微信支付接口是怎么做到的呢?今天就来介绍下商家如何开通微信支付接口的,商户开 ...

  5. 微信公众号可通过现金红包接口发放微信支付现金红包(附开发教程)

    标签: 农历新年将至,支付宝红包打了一仗,微信在朋友圈屏蔽了它的分享,但单防守还不行,进攻才是最好的防守.昨日,微信支付现金红包接口正式开放,只需开通微信支付,即可接入现金红包.微信公众号也可以发放现 ...

  6. 支付宝支付、微信支付(最详细教程)

    对接支付宝支付接口,官方文档已经写的很清楚了,但是也有很多像我一样的小白,第一次对接支付宝支付接口,会有些迷茫,所以我在此写下这篇文章,给我和我一样的同学,一点思路吧. 第一步:(先要在支付宝进行操做 ...

  7. 萤石微信支付对接(小程序版)

    1.萤石支付简介及流程 萤石支付,是对第三方支付平台的二次封装.考虑到的目的可能有:1.合资公司的金钱交易需要走总部财务 2.二次封装对接更加容易,与第三方支付sdk的交互都由萤石平台封装完成了. 1 ...

  8. 公众平台商户接入(微信支付)功能申请教程

    场景及类型介绍 商家可以申请公众账号支付和APP(应用客户端)支付两种接入微信支付方式. 公众账号支付:用户在微信公众帐号内使用微信支付消费,案例:易迅.QQ充值. APP(应用客户端)支付:用户在手 ...

  9. iOS支付宝(Alipay)接入详细流程,比微信支付更简单,项目实战中的问题分析

    最近在项目中接入了微信支付和支付宝支付,总的来说没有那么坑,很多人都说文档不全什么的,确实没有面面 俱到,但是认真一步一步测试下还是妥妥的,再配合懂得后台,效率也是很高的,看了这篇文章,你也只要几分钟 ...

最新文章

  1. php 几十万数据导出到csv
  2. Python os库的使用
  3. “图灵测试不重要”,一个违背机器人界祖宗的决定
  4. form 中Enctype=multipart/form-data 的作用
  5. spring beans源码解读之 ioc容器之始祖--DefaultListableBeanFactory
  6. GIt本地相关操作(一)
  7. rsync 常用命令及格式
  8. java 委托机制_通过反射实现Java下的委托机制代码详解
  9. go环境搭建_容器化 Go 开发环境的尝试
  10. 道指mt4代码_剑指offer算法题052:正则表达式匹配
  11. golang 1.10 mutex互斥锁源码
  12. 2014.11.12模拟赛【美妙的数字】| vijos1904学姐的幸运数字
  13. php 存储过程 sqlsrv_query,php-PHP如何得用sqlsrv函数来调用MSSQL中的存储过程,并返回数据集?...
  14. 单元测试 测试用例 用例测试文件golang的单元测试
  15. 从王者荣耀看设计模式(十六.原型模式)
  16. 同花顺通达信公式指标改写成python实现代码,纯numpy,无循环!
  17. 项目——网络对战五子棋(Web-Gobang)
  18. Python 读取/处理 s2k/$2k 文本文件
  19. 计算机网络(十)CSMA详解
  20. 冒烟测试和回归测试的区别

热门文章

  1. uboot 增加硬件看门狗
  2. Ubuntu18.04 安装 sublime3
  3. 防抖(debounce)、节流(throttle)以及前端锁(mutex)
  4. vue 微信公众号支付接口_总结vue项目中使用微信公众号支付的方法
  5. nextTrick的作用
  6. bootstrap之dropdown
  7. 数据挖掘软件 clementine软件的基本操作
  8. Alink漫谈(二十) :卡方检验源码解析
  9. 第六部份:Kate安装
  10. 车载30KW柴油发电机定制侧面板容易操作