微信支付-遇到的坑

3 */

4 public static String signature(Map<String, String> map, String key) {

5 Set keySet = map.keySet();

6 String[] str = new String[map.size()];

7 StringBuilder tmp = new StringBuilder();

8 // 进行字典排序

9 str = keySet.toArray(str);

10 Arrays.sort(str);

11 for (int i = 0; i < str.length; i++) {

12 String t = str[i] + “=” + map.get(str[i]) + “&”;

13 tmp.append(t);

14 }

15 if (StringUtils.isNotBlank(key)) {

16 tmp.append(“key=” + key);

17 }

18 String tosend = tmp.toString();

19 MessageDigest md = null;

20 byte[] bytes = null;

21 try {

22

23 md = MessageDigest.getInstance(“MD5”);

24 bytes = md.digest(tosend.getBytes(“utf-8”));

25 } catch (Exception e) {

26 e.printStackTrace();

27 }

28

29 String singe = byteToStr(bytes);

30 return singe.toUpperCase();

31

32 }

复制代码

微信支付第一个问题,数据加密的key。这个坑在于不细心,微信支付有很多key,包括我们微信绑定时候自己输入的key,还有微信给的随机字符key,而这里,在用于加密的key,并不是我们微信公众号中的 AppSecret,而是在微信支付商户后台设置的key,设置的位置为: key设置路径:微信商户平台(pay.weixin.qq.com)–>账户设置–>API安全–>密钥设置 如果不是使用该Key,哪怕是你的算法写对了,数据传到用户那里,依然返回的是签名错误。

PS:微信官方给出了一个验证签名准确性的工具,该工具地址为https://pay.weixin.qq.com/wiki/tools/signverify/,AnyWay,正如刚才说了,如果key设置的不正确,比如说使用了AppSecret ,那么,你会发现,该工具的出的加密字符串和自己得出的一模一样,然后当你发送给微信服务端的时候,永远返回的是错误。

微信支付第二个问题,post编码问题。当组装好数据后,需要通过POST的形式向微信服务器发送数据。可是,问题来了,微信的数据封装的完全正确,key也设置正确了,在官方的验证工具上验证出来也是正确的,可是,微信总是提示签名错误。这个问题出现在post请求的编码问题上,遇到这个问题的情况是,在封装数据的时候,xml里面加入了中文,然后每次请求就会报错,可是如果中文去掉,下单成功。最后才发现,原来POST的时候,没有设置编码,设置成为UTF8之后就没事了。可是,返回的签名错误,也真心难排查啊

微信支付第三个问题,js-sdk调起支付控件。这一步时讲在微信里面H5调起支付控件的。需要注意的是要在H5上面调出支付控件,第一件事需要在微信公众要后台添加指定域名允许该域名调起控件,否则,是不能调起的。设置的教程在这:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_3 。

设置完成之后,接下来是通过js调起,在此吐槽一下,我第一次做的时候,是直接copy的官方的js下来改的,可是。。。。。。。官方的JS上面全角半角的字符混合,导致的别说是他的JS了,就是我自己写的JS最后都没调出来。。。。。然后,关于提示,,苹果版还好,安卓版的微信,如果调不出控件,它一点反应都不会有的。。相对而言,苹果版会有一个弹框提示,所以后期,只要出现问题,都先用苹果测测看看出了什么错。

微信支付第四个问题,app端数据封装。能够统一下单了,这样一来就是对数据封装返回给前端了,这一部,还是需要进行签名,按理来说,前面和前面采用的是同样的方法,应该问题不大才对。确实,在web端和扫码支付都没多大问题,可是,app端问题来了。我在公司刚开始和安卓的同事调这个的时候,本来以为一个下午能搞定了。可是,却不如我们所想。我们全部采用的是官方给的要求进行封装的数据,我后台统一下单完成之后,给到安卓,结果安卓死活调不出支付控件,而且一直都返回-1的结果,该结果,可以说一点用处都没有。安卓端的同时调了好久,一直没有找到解决方案,值得一说的是,它官方给的Demo是可以调出结果界面,可是也是调不出支付控件的。而且,他的java文件,utf-8和GBK两种编码混在一起的。最后说一下,为啥app调不出支付控件。

图1

复制代码

1 //网页调起的时候

2 String time = Long.toString(System.currentTimeMillis());

3 back.put(“appId”, mchappid);

4 back.put(“timeStamp”, time);

5 back.put(“nonceStr”, “5K8264ILTKCH16CQ2502SI8ZNMTM67VS”);

6 back.put(“package”, “prepay_id=” + order.getPrepay_id());

7 back.put(“signType”, “MD5”);

8 String sign2 = SignatureUtils.signature(back, wx_key);

9

10 JSONObject jsonObject = new JSONObject();

11 jsonObject.put(“appId”, mchappid);

12 jsonObject.put(“timeStamp”, time);

13 jsonObject.put(“nonceStr”, “5K8264ILTKCH16CQ2502SI8ZNMTM67VS”);

14 jsonObject.put(“package”, “prepay_id=” + order.getPrepay_id());

15 jsonObject.put(“signType”, “MD5”);

16 jsonObject.put(“paySign”, sign2);

17

18 result.put(“status”, “success”);

19 result.put(“msg”, “下单成功”);

20 result.put(“obj”, jsonObject);

21 return result;

复制代码

复制代码

1 //APP调起的时候,请注意,安卓端不能用驼峰法,所有的key必须使用小写

2 String time = Long.toString(System.currentTimeMillis());

3 back.put(“appid”, app_mchappid);

4 back.put(“timestamp”, time);

5 back.put(“partnerid”, app_mchid);

6 back.put(“noncestr”, “5K8264ILTKCH16CQ2502SI8ZNMTM67VS”);

7 back.put(“prepayid”, order.getPrepay_id());

8 back.put(“package”, “Sign=WXPay”);

9 String sign2 = SignatureUtils.signature(back, wx_key);

10

11 JSONObject jsonObject = new JSONObject();

总结

这次面试问的还是还是有难度的,要求当场写代码并且运行,也是很考察面试者写代码
因为Android知识体系比较庞大和复杂的,涉及到计算机知识领域的方方面面。在这里我和身边一些朋友特意整理了一份快速进阶为Android高级工程师的系统且全面的学习资料。涵盖了Android初级——Android高级架构师进阶必备的一些学习技能。

附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题(含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)

里面包含不同方向的自学编程路线、面试题集合/面经、及系列技术文章等,资源持续更新中…
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!
见算法题汇总。)
[外链图片转存中…(img-h2zXBbJ9-1715305343565)]
里面包含不同方向的自学编程路线、面试题集合/面经、及系列技术文章等,资源持续更新中…
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!

  • 30
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值