首页 > 代码库 > 微信获取用户支付共享地址

微信获取用户支付共享地址

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

文档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

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

微信获取用户支付共享地址