[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. 基于CentOS中PXE网络环境构建实例
  2. 关于过往与未来的思考
  3. 上市近一年,良品铺子的“高端化”之路走通了吗?
  4. 3.游戏优化(CCSpriteBatchNode)
  5. 用iframe transform: scale() 缩小后点不到按钮_“打分”或者“打多少分”用英文可以怎样去表达?...
  6. php7 pdo mysql_PHP7添加pdo_mysql扩展
  7. java jar 环境变量_java-jar jar包带环境变量(参数)启动
  8. python的起源和发展_Python入门第一课——Python的起源、发展与前景!
  9. [Android]Cygwin使用及NDK编译方法
  10. 块状树(bzoj 3720: Gty的妹子树)
  11. mysql读写分离实战
  12. 一个完全免费的在线文字云网站
  13. Linux 系统调用
  14. 华中农业大学python实验题
  15. csgo跳投指令_CSGO控制台进阶指令
  16. 【渝粤题库】广东开放大学 建筑施工技术 形成性考核
  17. 个人HTML期末大作业~ 个人网页(HTML+CSS)6页面带下拉特效~简单带表格带设计说明 ~学生网页设计作业源码
  18. PingCAP CTO 黄东旭 :基础软件“好用”指南——必须跨越这两道鸿沟!
  19. 非常值得看的一篇文章—HP大中华区总裁孙振耀退休感言
  20. BT服务器架设全攻略

热门文章

  1. 省市县:数十万数据集PM2.5面板数据柵格数据(1998-2019)
  2. 北方工业大学计算机网络,北方工业大学计算机科学与技术研究生导师介绍:马东超...
  3. STM32CubeMX上手初体验
  4. 10-120V输入 输出可调 电流5A 外置MOS降压型DC-DC电源芯片
  5. python字典的items()方法
  6. 52单片机——定时器2详解
  7. PHP5.6与PHP7之间的区别
  8. IOU GIOU DIOU CIOU
  9. LCU 模式选择过程分析(CTU的深度选择及CU的分割)
  10. Unity DropDown 取消默认Value