zoukankan      html  css  js  c++  java
  • 微信获取用户支付共享地址

    微信就是个坑!!!接触过淘宝,支付宝,顺丰,银行,保险的对接,但这辈子估计都碰不上比微信更坑的了!!!

    文档API各种低级错误。

    DEMO都是错的,说好的参数小写,demo里面是大写。

    SHA1传参加密的样例,用他给的串,怎么都加密都加不出他的结果。

    甭管什么异常,调失败了就一条,写个错误码的枚举能费多少时间?微信大爷!

    文档里漏到的条件更不用说了。

    原本以为很简单的事,顶多两小时能搞定,写到ACIONT里,按其要求,后端生成参数,直接写到VIEW里。(这会微信支会的审核还没下来)

    通不过,怎么检查都通不过。联系客服各种踢皮球,官方邮件对面应该就是具干尸。

    因为本身项目和微信缓存的缘故,调试困难,无奈写个纯HTML+js的实现。(压根找不到微信清web缓存的地方,为了绕过微信的缓存,写静态页,写一个html1,测过后再写个html2……)

    还是不过,文档的条件条条都符合(文档加密的大小写是错的,我是对的,文档里加密的样例是错的,我也是对的)

    已经放弃了,这么简单个问题,前前后后居然浪费了一星期,很羞惭的面对领导,说微信坑爹,领导也不知信于不信!!与之对比的是,其他同事的接口实现,那叫个顺利,我都准备卷铺盖了。

    后来某一天,顺手到后台一看,顿时傻眼。

    文档没有的条件1,要开通微信支付。

    wx1

    文档没有的条件2,要开启共享收货地址。

    wx2

    文档没有的条件3,必须在设置的授权目录之下发起API调用。

    wx5

    把静态页改成VIEW,加路由,调到对应路径下,通过!大爷,您可终于过了!

    项目真正用的时候,还是要写在后台,前台JS代码并未封装和优化。

    贴代码

    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title></title>
    
        <script src="~/Scripts/jquery-1.10.2.js"></script>
        <script src="~/Scripts/components/core-min.js"></script>
        <script src="~/Scripts/components/sha1.js"></script>
    
        <script>
            function getappid() {
                return "appid"; //换成自已的appid
            }
            function getQueryString(name) {
                var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
                var r = window.location.search.substr(1).match(reg);
                if (r != null) return unescape(r[2]); return null;
            }
            function getTimeStamp() {
                var timestamp = new Date().getTime();
                var timestampstring = timestamp.toString();//一定要转换字符串
                oldTimeStamp = timestampstring;
                return timestampstring;
            }
    
            //得到随机字符串
            function getNonceStr() {
                var $chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
                var maxPos = $chars.length;
                var noceStr = "";
                for (i = 0; i < 32; i++) {
                    noceStr += $chars.charAt(Math.floor(Math.random() * maxPos));
                }
                oldNonceStr = noceStr;
                return noceStr;
            }
            //获取CODE
            var getcodeobj = {
                appid: getappid(),
                redirect_uri: "",
                response_type: "code",
                scope: "snsapi_base",
                state: "1"
            };
    
            //拼接url传参字符串
            function perapara(objvalues, isencode) {
                var parastring = "";
                for (var key in objvalues) {
                    isencode = isencode || false;
                    if (isencode) {
                        parastring += (key + "=" + encodeURIComponent(objvalues[key]) + "&");
                    }
                    else {
                        parastring += (key + "=" + objvalues[key] + "&");
                    }
                }
                parastring = parastring.substr(0, parastring.length - 1);
                return parastring;
            }
            //得到用户code
            function getcode() {
                var code = getQueryString("code");
                if (!code) {
                    var getcodeparas = $.extend(getcodeobj, {
                        redirect_uri: window.location.href
                    });
                    window.location.href = "https://open.weixin.qq.com/connect/oauth2/authorize?" + perapara(getcodeparas) + "#wechat_redirect";
                }
                else {
                    return code;
                }
            }
            //得到用户accesstoken
            function getaccesstoken(code) {
                var url = "/wechat.oauth/GetAccessToken";
                $.ajax({
                    type: "POST",  //默认是GET
                    dataType: "text",
                    url: url,
                    data: "code=" + code,
                    async: false,  //异步
                    cache: false, //不加载缓存
                    success: function (obj) {
                        access_tokenstring = obj;
                        isaccget = true;
                    },
                    error: function (req, msg, ex) {
                        $("#showerror").val(req.responseText.toString());
                    }
                });
    
            }
            function getSign(beforesingstring) {
                sign = CryptoJS.SHA1(beforesingstring).toString();
                return sign;
            }
    
            var signparasobj = {
                "accesstoken": "",
                "appid": getappid(),
                "noncestr": "",
                "timestamp": "",
                "url": ""
            };
        </script>
    </head>
    <body>
    <div>
        <label>showerror</label>
        <textarea id="showerror"></textarea>
        <!--<div id="showerror"></div>-->
        <label>code</label><input type="text" id="txtcode" /><br />
    
        <textarea id="txtinfo"></textarea>
        <label>accesstoken</label><input type="text" id="txtaccesstoken" />
    </div>
    
    <div id="showtestresult"></div>
    <label for="redhref">href测试</label> <input type="text" id="redhref" /><br />
    <label for="redhref">加密前参数</label>  <input name="44" id="signpre" type="text" /><br />
    
    <input name="44" id="thisurl" type="text" /><br />
    <input name="33" id="thisurl2" type="text" /><br />
    <input type="button" id="getaddress2" onclick="editAddress()" value="得到地址方式2" /><br />
    <input name="address1" id="address1" type="text" /><br />
    <input name="address2" id="address2" type="text" /><br />
    <input name="address3" id="address3" type="text" /><br />
    
    <div id="divinfo"></div>
    <div id="resvalues">aaaaaaaaS</div>
    <script>
        var codestring = "";
        var access_tokenstring = "";
        var oldTimeStamp;//保存timestamp,提交用
        var oldNonceStr; //保存nonceStr,提交用
        var sign;
        var isaccget = false;
    
        $(document).ready(
                function () {
                    codestring = getcode();
                    $("#thisurl").val(window.location.href);
                    $("#txtcode").val(codestring);
                    getaccesstoken(codestring);
                    $("#txtaccesstoken").val(access_tokenstring);
    
                });
        function editAddress() {
            var showobj2 = txtinfo != null ? txtinfo : document.getElementById("txtinfo");
            showobj2.value = '进入微信事件';
            $("#thisurl2").val(window.location.href);
            //签名
            var signparas = $.extend(signparasobj, {
                "accesstoken": access_tokenstring,
                "noncestr": getNonceStr(),
                "timestamp": getTimeStamp(),
                "url": window.location.href
            });
            $("#signpre").val(perapara(signparas));
            //签名
            var signstring = getSign(perapara(signparas));
            if (isaccget) {
                WeixinJSBridge.invoke('editAddress',
                        {
                            "appId": getappid(),
                            "scope": "jsapi_address",
                            "signType": "sha1",
                            "addrSign": signstring,
                            "timeStamp": oldTimeStamp,
                            "nonceStr": oldNonceStr
                        }
                        ,
                        function (res) {
                            var ff = ''; var obj = resvalues != null ? resvalues : document.getElementById('resvalues'); if (res == null) { obj.innerText = '测试返回为空'; }
                            else {
                                for (var key in res)
                                { var js = 'res.' + key + ' = ' + res[key].toString(); ff = ff + js; }
                                obj.innerText = ff;
                                document.form1.address1.value = res.proviceFirstStageName;
                                document.form1.address2.value = res.addressCitySecondStageName;
                            }
                        });
            }
        }
    </script>
    </body>
    
    </html>
    View Code

    引jq,CryptoJS加密包。

    ajax调用的后台action

    public string GetAccessToken(string code)
    {
            string appId = “你懂的”;
            string secret = “你懂的”;
    var result = Senparc.Weixin.MP.AdvancedAPIs.OAuth.GetAccessToken(appId, secret, code);
    return result.access_token;
    }

    调用SDK用的 Senparc.Weixin

    各位同道,见微信最好绕道。

    //部分回复有疑问

    这是目前微信最新的接口文档。

    https://res.wx.qq.com/paymchres/zh_CN/htmledition/download/bussiness-course2/wxm-payment-share-address1eec8d.pdf

    加密的部分依然是错的。

    访问路径的设置,文档里也丝毫未提。

    更旧的版本,大小写都是错的。

    这是文档里加密的部分,不心细看的可以试试,神仙才能加出这种结果。

    SHA1(accesstoken=OezXcEiiBSKSxW0eoylIeBFk1b8VbNtfWA
    LJ5g6aMgZHaqZwK4euEskSn78Qd5pLsfQtuMdgmhajVM5QDm24W8X3
    tJ18kz5mhmkUcI3RoLm7qGgh1cEnCHejWQo8s5L3VvsFAdawhFxUuLmg
    h5FRA&appid=wx17ef1eaef46752cb&noncestr=123456&timestamp=1384841012&url=http://open.weixin.qq.com/)=ca604c740945587544a9cc25e58dd090f200e6fb

  • 相关阅读:
    最全的 Twitter Bootstrap 开发资源清单
    jQuery布局插件UI Layout简介及使用方法
    SQLcode错误代码汇总和sqlstate=37000的解决方案
    JQUERY插件学习之jQuery UI
    如何判断/检查一个集合(List<string>)中是否有重复的元素
    反射原理及简介
    C# 获取文件夹下的所有文件的文件名
    委托编程指南
    模块封装与程序集
    Redis Lock
  • 原文地址:https://www.cnblogs.com/zihunqingxin/p/3974653.html
Copyright © 2011-2022 走看看