1. 前言

“好记性不如烂笔头”,现在 平常 碰到的一些知识点都是直接复制到印象笔记中,但是那些资料都比较零散,该总结的还得总结。前段时间完成了在线支付的微信支付,趁着一些注意地方没忘记,这里记录下来吧!

2. 准备

这里我不想吐槽,微信支付 比 支付宝 支付准备工作 麻烦不知道多少倍,我记忆中有三个地方的审核,当然这些不是开发内容,可能随时会变,开发时具体是什么就是什么,我这里只是给大家提个醒。

  • 企业认证,资料填写,等待审核

  • 应用创建认证,这里填写 Android 和 Ios 两边项目的一些信息,苹果不用说了,主要 是 安卓,需要填写签名,很多人或者资料都建议先填写 测试的签名 ,为了开发平常开发测试使用方便,但是我建议使用正式的签名,有很多办法解决 ,因为这里涉及到 签名 的获取,还是留到后面一起说吧。

  • 支付认证审核,应用创建后,默认是没有支付服务的,需要开通支付,又要填写资料,商家收款银行卡,最主要的是需要 法人身份证 正方面,这里特别要注意,当初苦逼的和领导说 需要 老板的身份证 正方面把他都吓一跳(上市公司老板 身价比较高…)

虽然微信有各种认证,各种等待,虽然提示 7 个工作日内,但是他们的效率,简直没的说,比支付宝快,一般来说半天或者一天,审核结果就下来了,这里给微信点个赞。

2.1 应用签名

这里单独列出来,因为这里涉及到 签名 的获取和使用 测试签名 还是 正式签名
微信当然提供了一个 apk 用来获取 app的签名,只要我们将已经签名的项目APP安装到手机上,然后再安装他们的 apk 获取签名,其实我不太建议这样做,有点麻烦,而且他们 apk 签名工具太反人类了,有木有,显示出来的 一大串字符串 ,又不能复制,只能对着电脑一个一个敲,有点容易出错。
其实应用签名通过处理 SHA1 值获取

SHA1: 68:1Y:0D:89:AC:4B:B3:OF:90:64:83:UW:95:44:B7:49:36:03:AE:27

对于如上一串 SHA1 值,将 [ : ] 去掉,大写字母改成小写,这就是 应用签名,特别注意,这里使用正式 keystore ,获取 SHA1 ,获取到的就是正式应用签名,对于应用怎样获取 SHA1 ,可以看我以前总结的一篇博客

* 特别注意 不是 SHA1 值 是 MD5值 进行 大写改小写 去掉 : *

快速获取debug.keystore和release.keystore的SHA1或者MD5值

很多资料都说在微信平台先填写测试的应用签名,方便测试,然后改回正式签名上线,其实没必要,一来呢修改签名是需要审核的,最低半天时间,然后呢有其他办法方便测试。具体看我以前总结的博客,大致说下思路,要么直接在 buildTypes.debug 下配置正式签名打包,这样运行时,直接签名不是默认的 debug ,而是我们覆盖设置的 正式签名。


还有一种办法 直接去 AS–>Build –>Select Build Variant –> 选择 release ,然后运行 AS。
前面那种办法我亲测有用,只有后面那种应该也可以,我在以前微信第三方登录时使用过,是可以的,因该是一个道理,没问题的。具体看下面博客吧!

项目gradle学习之路(1)

3 开发
如果调起支付出问题或者调不起微信支付,一般都会返回 -1 ,这个问题比较严重,网上都出了 类似的搜索词条了,这里我也碰到过 -1 ,我只能说明下 我检查的分析和手段,首先 一定要保证 微信平台的的签名和运行的APP签名一致,这一定要再三检查下,可以使用最老的办法,通过
Build –> Generate Signed APK –> 加上签名把 APK 生成出来在安装到手机上,微信端保证处于打开状态,然后网上说有可能需要清空微信的缓存,这里我倒是没有。

如果上述都没问题,但还是报 -1 ,那可能就是 二次签名 sign 出问题了,这个 sign 获取方式,微信提供了思路,但是竟然没提供函数方法,难道想考验开发的算法功力。。。

签名生成的通用步骤如下:第一步,设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。特别注意以下重要规则:◆ 参数名ASCII码从小到大排序(字典序);
◆ 如果参数的值为空不参与签名;
◆ 参数名区分大小写;
◆ 验证调用返回或微信主动通知签名时,传送的sign参数不参与签名,将生成的签名与该sign值作校验。
◆ 微信接口可能增加字段,验证签名时必须支持增加的扩展字段
第二步,在stringA最后拼接上key得到stringSignTemp字符串,并对stringSignTemp进行MD5运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。

这里有个要注意的点,先看下面文档上要求发起支付请求的参数

先说下我自己认为的微信支付流程: app界面上选定金额后点击微信支付,先调用后台提供的接口,传递一些参数过去,最主要的参数当然是 金额大小,然后后台返回给我们结果,包含上图中除了 应用ID 以外的剩下参数,我们在将这些参数设置到微信提供的 API 中,向微信发起支付请求 。

sign 这个字段是后台生成返回给我们的,我们在设置到请求参数中,所以后台在根据微信提供生成 sign 的算法时,上图中的 拓展字段 package 和 我们 用微信 API 设置参数的 字段不一样,

payRequest.packageValue = "Sign=WXPay";

看到没,所以我们后台在我一直 返回 -1 时也有疑问,到底使用哪个作为拼接的 key 。其实这里使用的还是
package。当然了 我们后台确实是他给我的 sign 出问题了,导致 公众号支付 IOS 支付都没问题,就我 安卓一直不行,最后我决定自己生成 sign 来说服他。

首先获取到后台返回给我们的所有数据,把他提供的签名 sign 去掉,然后 采用微信提供的 生成 sign
思路获取到 sign,再将和 sign 一起的数据一起设置到 微信API 中,如果可以成功调用 微信支付,则 sign 确实后台返回给我们的有问题。
自己拼接 key value 然后加密,可能会出错或者慢, 这里我在网上找了个生成 sign 的算法,找不到来源了,写博客的今天和当初时间很久了。

package com.guo.firstdemo;import org.junit.Test;import java.util.*;/*** Created by guozhaohui628@gmail.com on 2018/2/27* Description:*/
public class SignDemo {/*** 获取sign签名** @return*/@Testpublic void genPayReq() {// 把参数的值传进去SortedMap集合里面SortedMap<Object, Object> parameters = new TreeMap<Object, Object>();//应用IDparameters.put("appid", "wx4446aecbce287ab8");//随机字符串parameters.put("noncestr", "48xQcKUtC2SULcmg");//扩展字段parameters.put("package", "Sign=WXPay");//商户号parameters.put("partnerid", "1499280172");//预支付交易会话IDparameters.put("prepayid", "wx201802271751141caa31c4510450228340");//时间戳parameters.put("timestamp","1519725074");String characterEncoding = "UTF-8";String mySign = createSign(characterEncoding, parameters);System.out.println("我的签名是:" + mySign);}/*** 微信支付签名算法sign** @param characterEncoding* @param parameters* @return*/public static String createSign(String characterEncoding,SortedMap<Object, Object> parameters) {StringBuffer sb = new StringBuffer();Set es = parameters.entrySet();// 所有参与传参的参数按照accsii排序(升序)Iterator it = es.iterator();while (it.hasNext()) {@SuppressWarnings("rawtypes")Map.Entry entry = (Map.Entry) it.next();String k = (String) entry.getKey();Object v = entry.getValue();if (null != v && !"".equals(v) && !"sign".equals(k)&& !"key".equals(k)) {sb.append(k + "=" + v + "&");}}sb.append("key=" + "a0fa2659hdf65auh345fc9f6567k57fb5575f9c4"); //KEY是商户秘钥System.out.println("   ---sb--   "+sb.toString());String sign = MD5Util.MD5Encode(sb.toString(), characterEncoding).toUpperCase();return sign;}}
package com.guo.firstdemo;import java.security.MessageDigest;/*** Created by guozhaohui628@gmail.com on 2018/2/27* Description:*/
public class MD5Util {private static String byteArrayToHexString(byte b[]) {StringBuffer resultSb = new StringBuffer();for (int i = 0; i < b.length; i++)resultSb.append(byteToHexString(b[i]));return resultSb.toString();}private static String byteToHexString(byte b) {int n = b;if (n < 0)n += 256;int d1 = n / 16;int d2 = n % 16;return hexDigits[d1] + hexDigits[d2];}public static String MD5Encode(String origin, String charsetname) {String resultString = null;try {resultString = new String(origin);MessageDigest md = MessageDigest.getInstance("MD5");if (charsetname == null || "".equals(charsetname))resultString = byteArrayToHexString(md.digest(resultString.getBytes()));elseresultString = byteArrayToHexString(md.digest(resultString.getBytes(charsetname)));} catch (Exception exception) {}return resultString;}private static final String hexDigits[] = { "0", "1", "2", "3", "4", "5","6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };
}

里面 //KEY是商户秘钥 有点重要 注意别泄露 。
好的 我到这里就解决了,后台修改了 生成 sign 的算法,成功调起了 微信支付。

Android集成微信支付跳坑指南相关推荐

  1. Android集成微信支付

    Android集成微信支付 项目中集成第三方支付的功能,基本是我们app中经常用到的功能.今天先给大家讲一下微信支付的集成过程,重点只说一下代码部分.首先,你要到微信开发者平台注册账号,并创建你的应用 ...

  2. Android 集成微信支付和支付宝支付工具类

    Android 集成微信支付和支付宝支付工具类 1.前言 去年年底接了一个商城app 外包项目,里面尼涉及到 微信和支付宝支付,这里我整理出几个工具类,下面就和大家分享一下,废话不多说,下面我一步一步 ...

  3. Android集成微信支付之-天坑

    项目集成微信支付,折腾了三天左右,坑太多,做个简单记录 开通和主要原理不再讲了,参考微信支付官网 截个官网的业务流程图,下面好说明 1 支付结果回调(图中的17步) 支付结果回调,微信官方的说法是: ...

  4. android微信迁移数据,【CSDN博客迁移】Android集成微信支付之-天坑

    项目集成微信支付,折腾了三天左右,坑太多,做个简单记录 开通和主要原理不再讲了,参考微信支付官网 截个官网的业务流程图,下面好说明 微信支付业务流程.png 1 支付结果回调(图中的17步) 支付结果 ...

  5. Android 集成微信支付和支付宝

    最近比较闲,公司项目更换后台,于是自己来研究微信支付和支付宝支付,把自己学习的过程写下来,以备以后查看. 注:要集成微信支付和支付宝功能,必须要有以下几个配置信息,而这写信息需要公司去微信支付和支付宝 ...

  6. 微信支付 android4.4,Android集成微信支付

    我之前集成过Ping++这种第三方的支付,但没有单单针对微信官方的支付集成过,这次做遇到很多坑,记录下. 微信支付的过程: 首先在微信开放平台上申请AppID,在开放平台的应用管理中将你的应用启用支付 ...

  7. 单页面应用微信分享跳坑指南

    前言 最近在开发的时候遇到了一个微信分享的bug,就是无论你在哪个路径下的页面,发送给朋友后点开都只会跳到项目的首页.本来微信分享这个只算是一个小功能,也很好解决,但由于项目的特殊性,使得在这个bug ...

  8. Android 集成微信支付详解

    打包后才能起调支付 微信支付成功起调 微信skd下载:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=11_1 签名APK下载:h ...

  9. Android集成微信支付SDK,实现支付功能

    官方集成文档地址:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_5# 一.在您 App Module 的 build.gra ...

最新文章

  1. java which语句,java入门之表达式、语句、块
  2. 知乎:中国工商银行南宁分行丢失2.5亿,工作人员个人行为,与银行无关
  3. php做通讯录界面,PHP 制作通讯录(三)
  4. plot函数_时间序列:python移动窗口函数前言
  5. java创建读取文件_Java实现文件的创建、读取、写入操作-Fun言
  6. 从forEach到迭代器
  7. 计算机发展的新技术,计算机新技术发展的有关论文
  8. spurious wakeup 虚假唤醒
  9. 爬虫,酷我音乐接口解析
  10. STACEY矩阵-0114
  11. ModSecurity web application firewall (WAF) Research - .Little Hann
  12. sql 纵向求和_SQL语句求和语句该怎么编写?有几种方法?
  13. 关于windows桌面网络图标显示未连接却可以上网的情况
  14. 揭示未来方向:2018中国TMT行业“领秀榜”盛典直击
  15. 【键盘开箱】B.FRIENDit壁虎忍者RF1430K 2.4G无线键盘,满足办公室安静需求的无线键盘!
  16. Type-C改成OTG数据线
  17. python逐笔输入数据_知到智慧树Python数据分析与数据可视化结课测验
  18. openstack neutron网络插件学习(三)【Open vSwitch实现】
  19. C++实现rviz 2D Pose Estimate 功能设置机器人初始坐标
  20. 深入了解g1收集器(R大答网友问)

热门文章

  1. 可替代TPS51200的国产线性终端稳压器SGM2054助力DDR供电设计
  2. 如何将markdown文档一键转化为视频?
  3. python numpy数组含逗号的切片
  4. 盛派微信 The ‘hr‘ start tag on line 6 position 2 does not match the end tag of ‘body’ 错误解决方案
  5. ASP.NET CORE下用盛派微信SDK取微信openid
  6. Chrome Stylist 插件 (CSS备份)
  7. 开发iPad 画中画功能遇到的一些问题
  8. 坑爹的北大青鸟长沙东塘实力校区(转载)
  9. QQ请删除TXPlatform.exe和TXPFProxy.dll
  10. 50个经典的Photoshop磨皮教程