###一.业务场景 要上城市微信服务,为了完成快速上线决定采用原有的微信中的功能和页面,但是微信城市服务审核有个特殊要求,办理类的结果必须接入微信的城市服务结果页,这明显与原有微信公众号的业务逻辑不同;另外微信城市服务结果页最终要求提交的数据中包含公众号的openid。 ###二、问题分析 经过对问题的分析,得出以下必须解决的问题:
(1)如何在不关注公众号的情况下拿到openid
(2)业务处理完毕后如何判断当前是城市服务而不是公众号
###三、解决方法 (1)问题1:因为我们原先使用的是静默授权登录的方式这一块必须做改动,把静默授权改成微信公众平台开发 OAuth2.0网页授权获取用户基本信息的方式既可以解决不关注微信公众号拿到用户微信openid 参考:http://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.html
(2)问题2:微信城市服务都是自定义入口链接,把入口链接上加上对应城市服务的城市Id参数和要提供服务的参数,这个链接指向的路由在服务端完成网页授权获取openid 和获取城市Id和提供服务路由名称,然后通过重定向的方式把链接重定向到客户端页面并且加上城市参数,客户端获取城市参数并且保存到localStorage中。刚开始以为这样很完美,但是后来发现还是不行因为微信不支持sessionStorage就意味着localStorage无法清除,因为我们城市服务和微信公众号是共用域名,最后没办法只能通过为城市服务添加一个新的域名,所有城市服务入口都走新的域名。
除了以上还存在一个问题就是在处理结果后如何跳转城市结果页,我们采取在客户端向服务端提交的参数中都追加上城市id,在服务端最终处理完结果后返回给客户端城市id,根据城市Id是否为空来判断是否去城市结果页,同时openid 也通过服务端返回解决。
###四、城市服务的坑 (1) 问题一 微信城市服务结果页需要提交模板数据,发给我们的模板数据格式类似是:{{DDJH.DATA}},我们写的代码是:
var wxdata = {
"GPSJ.DATA":{"value":selltime,"color": "#173177"},
"DDH.DATA":{"value":orderno,"color": "#173177"},
"DDJE.DATA":{"value":orderprice,"color": "#173177"},
"REMARK":{"value":remarksign,"color": "#173177"},
}
可是怎么都调试不通过报模板数据格式不正确,后来我们就调整为
var wxdata = {
"GPSJ":{"value":selltime,"color": "#173177"},
"DDH":{"value":orderno,"color": "#173177"},
"DDJE":{"value":orderprice,"color": "#173177"},
"REMARK":{"value":remarksign,"color": "#173177"},
}
居然通过了,真是纳闷了!
(2)注意事项 微信最终提交的数据只有_提交的Json数据参与编码_,并且链接最后加上“#wechat_redirect”,代码如下:
var wxservicedata={
"touser":openid,
"template_id":"1212121212",
"topcolor":"#FF0000",
"data":wxdata,
};
var paramstr = JSON.stringify(wxservicedata);
var url="https://city.weixin.qq.com/cgi-bin/entry?result_data=" + encodeURIComponent(paramstr) + "#wechat_redirect";
以上就是本次做微信城市服务的一些经验和遇到的问题,希望能够帮助做同样事情的人!