最近要接入微信的收货地址共享接口,总是不成功,折腾了好几天,实在没办法网上搜到的帖子也是骂声一片。我把我碰到并解决问题的过程分享出来,希望能给微信的接口文档起到一个辅助作用,让后面进来的开发者能快速的接入,而不需要像我们一样苦逼的浪费好几天,甚至一周的青春。各种羞辱、谩骂的话就不说了,本人还算文明。
如果你能搜到本贴,说明你已经碰到了各种 edit_address:fail ,那么请你仔细阅读我提供的操作步骤。
======================================
1. 请你仔细研读微信官方的接口文档,虽然写的不是特别好,但还是请一字不拉的读完,并理解。我个人的经验,仔细读过后,还是能理解的。
2. 请严格按照接口文档的说明来,不能自以为是的认为微信应该是怎么干的。他说大写,你就大写,他说小写,你就小写,乖乖听话就行。(我犯的错误就是自以为是)
3. 还是不行的话,请参考下面被折腾到快不行的两网友的帖子:
http://www.front2end.cn/blog/WeChat-delivery-address-sharing-interface-hidden-mystery.html
http://doc.okbase.net/zihunqingxin/archive/99799.html
说到这里,其实上面网友碰到的问题,我都没碰到。本人还是仔细研读,并乖乖的按照微信的接口文档来的,可一个不留神还是犯了先入为主、自以为是的错误。
4. 我碰到的问题和url有关,微信接口要求我们的url必须带上授权回调后的code和state参数,我的url是这样的:http://www.xxx.com/addr.jsp?code=xxxx&state=yyyy,我当时的想法是微信要求组装签名字符串的时候,要求用"&"来串起各个需要签名的参数,而我的url里面本身就带有"&",我二话没说就把我的url参数值利用js 的encodeURIComponent() 方法编码了一下,结果就埋下了隐患,微信死活给我 "edit_address:fail"的返回值,加上我就是没想到是url 编码后出的问题,就这问题让我上火了好几天。后来把encodeURIComponent去掉,立马就好了。在调试过程中url的参数值给我的感觉是请越简短越好,不要带中文、网址等,感觉容易签名不过,结论不肯定。加上微信的错误返回值提示的又笼统,大家还是简单点好。
代码共享(jsp):
<%@page import="java.util.Map"%> <%@page import="java.util.HashMap"%> <%@page import="com.rockitv.util.JSONUtils"%> <%@page import="com.rockitv.http.Response"%> <%@page import="com.rockitv.http.RockitvHttpClient"%> <%@page import="com.rockitv.http.HttpManager"%> <%@page import="java.util.UUID"%> <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <% String code = request.getParameter("code"); String state = request.getParameter("state"); String accessTokenUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=appID&secret=appSecret&code="+code+"&grant_type=authorization_code"; Response resp = HttpManager.getRequest(new RockitvHttpClient(), accessTokenUrl, null); int statusCode = resp.getStatusCode(); String content = resp.getContent(); Map<String, Object> accessTokenObj = JSONUtils.getMapper().readValue(content, HashMap.class); String accessToken = (String) accessTokenObj.get("access_token"); String timeStamp = (System.currentTimeMillis() / 1000) + ""; String nonceStr = UUID.randomUUID().toString(); %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta name="viewport" id="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1" /> <meta name="apple-mobile-web-app-capable" content="yes" /> <meta name="apple-mobile-web-app-status-bar-style" content="black" /> <meta name="format-detection" content="telephone=no" /> <title>addr test</title> <!-- 这个js库可以在网上找到 --> <script type="text/javascript" src="./js/sha1.js"></script> </head> <body> addr test <br> code: <%=code %> <br> state: <%=state %> <br> statusCode: <%=statusCode %> <br> content: <%=content %> <br> <input type="button" name="" value="-----微信地址-----" onclick="addr()"> </body> <script type="text/javascript"> alert(window.location.href); var signStr = ""; signStr += "accesstoken="+'<%=accessToken%>'; signStr += "&appid=appID"; signStr += "&noncestr="+'<%=nonceStr%>'; signStr += "×tamp="+'<%=timeStamp%>'; signStr += "&url="+window.location.href; // signStr += "&url="+encodeURIComponent(window.location.href); alert("signStr : " + signStr); // signStr = "accesstoken=OezXcEiiBSKSxW0eoylIeBFk1b8VbNtfWALJ5g6aMgZHaqZwK4euEskSn78Qd5pLsfQtuMdgmhajVM5QDm24W8X3tJ18kz5mhmkUcI3RoLm7qGgh1cEnCHejWQo8s5L3VvsFAdawhFxUuLmgh5FRA&appid=wx17ef1eaef46752cb&noncestr=123456×tamp=1384841012&url=http://open.weixin.qq.com/"; var addrSign = CryptoJS.SHA1(signStr, {asString:true}); addrSign = addrSign.toString(); alert("addrSign type : " + typeof addrSign); alert("addrSign : " + addrSign); function addr() { alert("addr : start"); WeixinJSBridge.invoke('editAddress', { "appId": "appID", "scope": "jsapi_address", "signType": "sha1", "addrSign": addrSign, "timeStamp": "<%=timeStamp%>", "nonceStr": "<%=nonceStr%>" }, function (res) { alert(JSON.stringify(res)); //若 res 中所带的返回值不为空,则表示用户选择该返回值作为收货地址。 //否则若返回空,则表示用户取消了这一次编辑收货地址。 /* document.form1.address1.value = res.proviceFirstStageName; document.form1.address2.value = res.addressCitySecondStageName; document.form1.address3.value = res.addressCountiesThirdStageName; document.form1.detail.value = res.addressDetailInfo; document.form1.phone.value = res.telNumber; */ } ); alert("addr : end"); } </script> </html>
相关推荐
本文将详细讲解“微信收货地址共享接口类”的实现,以及如何使用提供的`WxAddress.php`和`WxAddressDemo.php`这两个文件。 1. **微信接口概述** 微信开放平台提供了丰富的API接口,其中包括用户收货地址的获取接口...
微信提供了丰富的API接口,包括用户授权、消息推送、支付功能等,而收货地址接口属于用户信息获取的一部分。在微信开发文档中,我们可以找到关于获取用户收货地址的接口说明,通常涉及到OAuth2.0授权流程,以及获取...
功能简介微信收货地址共享,是指用户在微信浏览器内打开商品H5 网页,填写过地址,后续支持快速选择免填写,也可增加和编辑。此地址为用户属性,可在商户网页中共享使用
本人已经实现小程序webview 调用ectouch的h5页面,然后由h5发起调用微信地址。大家有兴趣可以看看我的小程序示例,我小程序里面有我的联系方式 不懂的从小程序上联系我咨询,微信小程序那里搜索:飞机杯男用
微信小程序用户授权-首页-登录master.zip微信小程序用户授权-首页-登录master.zip微信小程序用户授权-首页-登录master.zip微信小程序用户授权-首页-登录master.zip微信小程序用户授权-首页-登录master.zip微信小程序...
微信小应用-小程序-demo-仿芒果TV (持续更新) 由于时间的关系,没有办法写一个完整的说明,重点是页面展示效果,还有其中遇到的一些坑分享一下,后期不定期更新坑和DEMO 官方文档:...
编写微信小程序支付后端接口-TechatPayDemo
4. **API接口**:微信小程序提供了丰富的API接口,如网络请求、本地存储、地理位置、设备信息等,开发者可以利用这些接口实现与服务器的通信、获取用户位置、访问手机硬件功能等。 5. **事件处理**:组件可以通过...
易语言调用微信官方接口-微信OCR识别 简单易用,一键调用 需要注意的是 ACCESS_TOKEN 只能在微信公众号服务的白名单IP内 请求才能获取到 这里做的微信公众号的调用, 小程序的调用也是一样的只是请求参数不一样而已
微信公众号零基础开发视频--微信语义接口,零基础视频开发介绍 对应视频请下载对应连接,微信公众号开发视频(全)
微信公众号零基础开发视频--JS-SDK的基础接口和分享接口,零基础视频开发介绍 对应视频请下载对应连接,微信公众号开发视频(全)
它们都是由下列子项目组合而成, node-weixin-api只是将业务接口统一到一个api里方便调用,而不必一个一个重新安装:node-weixin-config 用于微信配置信息的校验node-weixin-auth 用于与微信服务器握手检验node-...
微信商城系统源码---.NET平台
基于Spring Boot 和 WxJava 实现的微信公众号Java后端Demo,支持多公众号
微信公众号零基础开发视频--JS-SDK多媒体接口和其他接口,零基础视频开发介绍 对应视频请下载对应连接,微信公众号开发视频(全)
PHP微信公众号微信支付完整示例-Demo,只需修改配置几个参数就可以正常运行。里面附含有说明
源码毕业设计高分毕设-私家车位共享系统微信小程序的设计实现-API接口基于ssm框架实现.zip 个人经导师指导并认可通过的高分设计项目,评审分98分。主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的...
微信小程序开发图解案例教程-源代码微信小程序开发图解案例教程-源代码微信小程序开发图解案例教程-源代码微信小程序开发图解案例教程-源代码微信小程序开发图解案例教程-源代码微信小程序开发图解案例教程-源代码...
微信公众平台服务号--自定义菜单示例代码
微信源码_微信第三方平台源码_微信第三方接口源码-微趣能