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

  • 相关阅读:
    事务传播机制,搞懂。
    洛谷 P1553 数字反转(升级版) 题解
    洛谷 P1200 [USACO1.1]你的飞碟在这儿Your Ride Is Here 题解
    洛谷 P1055 ISBN号码 题解
    洛谷 P2141 珠心算测验 题解
    洛谷 P1047 校门外的树 题解
    洛谷 P1980 计数问题 题解
    洛谷 P1008 三连击 题解
    HDU 1013 题解
    HDU 1012 题解
  • 原文地址:https://www.cnblogs.com/zihunqingxin/p/3974653.html
Copyright © 2011-2022 走看看