到处都是坑的微信支付V3

业务需要一个在微信上能付款的功能,于是乎想到了最普遍的支付宝,坑爹的是T与A是水火不容啊,默默的还是接微信支付吧,没想到从此掉进了连环坑……

网上写微信支付接口的还是很多,PHP官方有(鄙视源码作者,连参数对应都错了,能跑通才怪),NET版 微信支付--入门篇 这篇算是比较全的,java版。

PHP的只能参考,终究还是先按NET版的还创建项目,不过文章里面也没具体写到如何前后台交互(偶用的MVC),对于初次接触的人来说只能问题来一个解决一个。

至于怎么从0开发就不用详细说明了,参考这位仁兄的 微信支付--入门篇 ,微信支付V2版网上也有Demo,但V3与V2相差太大,以此就新版V3 碰到的问题来说明解决方法。

基础问题先排除:

    1. 确保 商户功能 审核通过,会有官方邮件
    2. 支付授权目录(注意看文档,大小写关系很大 点击支付按钮,提示“access_denied” 网上有很多关于此问题的解决)
    3. 点击支付按钮,提示“access_not_allow” 需要将测试人的微信帐号加入白名单
    4. 【在开发调试阶段,测试链接需要在公众号内点击打开 白名单用户在公众号内向公众号发一条消息,消息内容即为测试链接,然后点击打开】文档中写得很清楚,但中招的人还是不计其数(偶也中了……)。
    5. 【参数大小写敏感】md5 运算后,字符串的字符要转换为大写,注意是MD5运算模块。

基本问题排除后,出问题最多的就是 利用JSAPI 支付,提示“该公众号支付签名无效,无法发起该笔交易”,此问题搞了2天多,网上到处搜索,不停的对比文档,无耐欲哭无泪啊,“不要用wifi和用流量才不报错”的答案都有(没遇到过)

基于园友提出的另一个问题”测试目录改为http://mall.xxx.com/后,网页支付时直接提示get_brand_wcpay_request:fail_invalid appid 。使用了其他的目录如http://store.xxx.com/ 也毫无问题。估计微信内部把含mall的支付都给屏蔽了。 “ 此问题还没亲自验证,不过在微信中还是请不要用关于阿里有关的域名,否则都不知道怎么坑死的。

具体的问题与 坑人的微信新版支付(V3.3.6) 中说的一样,能得到预支付 ID:prepay_id,但点击支付就是一直 提示“该公众号支付签名无效,无法发起该笔交易”,又不能本地调试,只能发布后写日志。

根据网上说的调整参数位置、没办法又看文档,那问题出在哪呢?

签名无效,说明出在第二次签名,此次要将参数提交给前台用js来传给微信来校验,查看MD5操作,

prepay_id的获得需传参:

 

其中MD5签名方法

  /// <summary>
        /// 创建md5摘要,规则是:按参数名称a-z排序,遇到空值的参数不参加签名
        /// </summary>
        /// <param name="key">参数名</param>
        /// <param name="value">参数值</param>
        /// key和value通常用于填充最后一组参数
        /// <returns></returns>
        public virtual string CreateMd5Sign(string key, string value)
        {
            StringBuilder sb = new StringBuilder();

            ArrayList akeys = new ArrayList(Parameters.Keys);
            akeys.Sort();

            foreach (string k in akeys)
            {
                string v = (string)Parameters[k];
                if (null != v && "".CompareTo(v) != 0
                    && "sign".CompareTo(k) != 0 && "key".CompareTo(k) != 0)
                {
                    sb.Append(k + "=" + v + "&");
                }
            }

            sb.Append(key + "=" + value);

            string sign = MD5Util.GetMD5(sb.ToString(), GetCharset()).ToUpper();

            return sign;
        }

 

1.package改为prepay_id=u802345jgfjsdfgsdXXX 的格式(html页也是此格式)

2.加入signType为MD5加密参数(有人说不加是不对的)

3.两次MD5加密都要按文档的方法 key要放在最后再加密

4.MD5加密对大小写加密的结果是不一样的,检查 appId与appid、timeStamp与timestamp加密后是不一样的,确保HTML与后台加密的参数一模一样,是一模一样哦!!(坑中坑,没想到微信支付竟然对大小写敏感到如此地步),注意第一次加密参数都是小写

5.参数个数5个

6.body参数过长

7.加入openid

我们的问题大多出现在4,按上面顺序解决后终于看到了支付窗口!!!!

此文献给还在深坑中的小伙伴们……

不说了,说多了都是泪……

       之前微支付已经集成到项目中一直没时间抽出,现在需要的留下邮箱,java的单独说明下,点下推荐。

   鉴于没时间看邮件急于想要的可自行扫文尾的二维码进入微信公众号【一个码农的日常】,回复 net支付 或 java支付  或 php支付

        或加入  新建2号QQ群:340250479  (1号群: 437802986 已满)在文件里面有源码地址(等群主有时间会通过)。

       这里抽出来的是net版本的,主要解决前期页面支付问题,只是个基本的demo,没有回调页面。有园友也提出了demo中的不足,建议先跑通这个demo,然后在此基础上补充不严谨的支付逻辑,毕竟是涉及到money的问题,毕竟也只是个demo,不能不思考就完全照般。

       微信现在开放了最新的JS-SDK, 有园友指出现在的demo上用js-sdk会冲突,建议先不用js-sdk,能运行后,可将全部js都照JS-SDK的支付方法更改。微信JS-SDK说明文档哥也只能帮你到这了……

=============================================================

争对于园友新手调通支付后回调页面问题特此又写了一篇 到处都是坑的微信支付V3之 微信支付回调页面 以供参考。

最近将NET版的回调页也加入了源码。

 

        其它干货下载资源已放入公众号【一个码农的日常】微信号:icodertime 

     

时间: 2024-10-24 17:48:20

到处都是坑的微信支付V3的相关文章

到处都是坑的微信支付V3之 微信支付回调页面

据上次 到处都是坑的微信支付V3 后很多园友在被虐了千百遍后终于跳转到了亲切的微信支付界面,但输入密码支付后却不知道怎么处理了,接下来补上支付后的处理流程. 1. html中根据前台支付后反馈信息成功与否跳转到相关页面 if (res.err_msg == "get_brand_wcpay_request:ok") { // message: "微信支付成功!", window.location.replace("@Url.Content("~/

微信支付[v3]

原文:微信支付[v3] V2升级V3 顺便记录一下 ,文档: http://pay.weixin.qq.com/wiki/doc/api/index.html !!! 支付授权目录与测试人的微信帐号白名单(出现access_denied或access_not_allow错误,请检查是否设置正确) 微信签名(用于jssdk调用支付,查询订单,异步参数签名等) 数字证书,用于微信退款 参数签名 对所有传入参数按照字段名的ASCII 码从小到大排序(字典序)后,使用URL 键值对的格式(即key1=v

android端微信支付V3版本地签名统一下单详解_Android

满满的都是坑,因为服务器偷懒让客服端写统一下单,服务器只给了通知的url.微信的支付demo并没有统一下单的代码. 读此文前先阅读: https://pay.weixin.qq.com/wiki/doc/api/app/app.PHP?chapter=9_1 一步步的来  先根据统一下单的参数介绍工具: 1. 获取到当前的ip: <span style="font-size:14px;">public String getLocalIpAddress() { try { f

android端微信支付V3版本地签名统一下单详解

满满的都是坑,因为服务器偷懒让客服端写统一下单,服务器只给了通知的url.微信的支付demo并没有统一下单的代码. 读此文前先阅读: https://pay.weixin.qq.com/wiki/doc/api/app/app.PHP?chapter=9_1 一步步的来  先根据统一下单的参数介绍工具: 1. 获取到当前的ip: <span style="font-size:14px;">public String getLocalIpAddress() { try { f

Android—基于微信开放平台v3SDK开发(微信支付填坑)_Android

接触微信支付之前听说过这是一个坑,,,心里已经有了准备...我以为我没准跳坑出不来了,没有想到我填上了,调用成功之后我感觉公司所有的同事都是漂亮的,隔着北京的大雾霾我仿佛看见了太阳~~~好了,装逼结束...进入正题 开发准备: 1.在微信开放平台申请账号 2.成功后创建应用,就是填一些看似很官方很正经的资料了...(说审核7天左右,没有意外的情况下你的app第二天就审核成功了是不是很开心,有了appid,是不是就可以调用微   信支付了????-------想多了,真的) 3.微信支付是需要额外

微信支付java版V3验证数据合法性(Deom)_java

1.1 解析微信回调数据 InputStream inStream = request.getInputStream(); ByteArrayOutputStream outSteam = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int len = 0; while ((len = inStream.read(buffer)) != -1) { outSteam.write(buffer, 0, len); } o

android微信支付问题总结

首先我们先看一个android微信支付时遇到的一个错误提示: onPayFinish, errCode = -1  当你参数签名都没有问题的时候,出现这个提示,请按照如下操作: 在你的项目测试android微信的组件(微信分享.微信支付等)的时候,一定要用你自己的keystore签名出来测试,如果用debug.keystore肯定是不成功的! 本文部分内容转自:http://blog.csdn.net/baidu_17508977/article/details/44517283 1,在微信开放

关于微信支付的支付授权目录是如何定义的

问题描述 最近在做微信支付v3版的开发,在测试时报access_control:not_allow.查了资料发现应该是支付授权目录不对的原因.这里请教下:我的页面是在WEB-INF目录下的,那么我的支付授权目录是否应该包括WEB-INF这一级?因为WEB-INF下的页面客户端是无法直接访问的,需要由后台跳解析转到.那么这里再衍生出一个问题,由于微信支付本身是JS方式的Ajax请求,因此它判断来路页面就是支付页面URL,而这个URL就应该是微信浏览器的URL,也就是说支付授权目录是根据微信浏览器的

微信支付开发(8) 刷卡支付

关键字:微信支付 微信支付v3 刷卡支付 统一支付 prepay_id 作者:方倍工作室原文: http://www.cnblogs.com/txw1958/p/wxpayv3-micropay.html    本文介绍微信支付下的刷卡支付的开发过程.刷卡支付是指用户打开微信钱包的刷卡的界面,商户扫码后提交完成支付的支付过程.     一.刷卡支付API 接口地址 https://api.mch.weixin.qq.com/pay/micropay 是否需要证书 不需要. 输入参数 名称 变量名