微信公众采坑记录-微信weixinjs分享那些坑

2018-02-11 14:16:41来源:oschina作者:IT小香猪人点击

分享

微信业务流程图


为什么要去微信再回到自己的服务器?通过什么方式去微信?


去微信再回来的目的是:获取code值,根据code换取access_token最终获取微信用户的openid。这样去微信然后由微信返回自己的业务服务器


/**


* 生成Authorize链接


* @param appId 应用id


* @param redirectUri 回跳地址


* @param state 重定向后会带上state参数,开发者可以填写a-zA-Z0-9的参数值,最多128字节


* @param snsapiBase snsapi_base(不弹出授权页面,只能拿到用户openid)snsapi_userinfo(弹出授权页面,这个可以通过 openid 拿到昵称、性别、所在地)


* @return url


*/


public static String getAuthorizeURL(String appId, String redirectUri, String state, boolean snsapiBase) {


Map params = new HashMap();


params.put("appid", appId);


params.put("response_type", "code");


params.put("redirect_uri", redirectUri);


// snsapi_base(不弹出授权页面,只能拿到用户openid)


// snsapi_userinfo(弹出授权页面,这个可以通过 openid 拿到昵称、性别、所在地)


if (snsapiBase) {


params.put("scope", "snsapi_base");


} else {


params.put("scope", "snsapi_userinfo");


}


if (StrKit.isBlank(state)) {


params.put("state", "wx#wechat_redirect");


} else {


params.put("state", state.concat("#wechat_redirect"));


}


String para = PaymentKit.packageSign(params, false);


return authorize_uri + "?" + para;


}

微信weixinjs分享那些坑


1、分享出去图片自己能看,他人看不见?红包 福利 领取 会被微信k掉的,坑不坑。


恭喜你,遇到这个问题调整文案吧,下面这些统统不行


desc = '51妹子网发红包啦,快来领红包吧!';


desc = '51妹子网发福利啦,快来领取红包吧!';


desc = '51妹子网发红包啦,快来领取吧!';

2、域名重定向(例如扫码分享至微信)


【pc】jad.yxyun.win/test.html 里面的扫码分享 打开【wx】www.yxyun.win/test/v3/index,此时在index页面接入微信jssdk,控制分享相关的打开url


var prefixUrl = '${WECHAT_URL!}' + 'web/v321/jfect/${refTrid!}&=';


var prefixUrl2 = "${BASE_PATH }web/v321/jfect?uuids=${refTrid!}&t=t";


最开始在开发阶段,用微信模拟器直接调试,sdk成功,分享出去prefixUrl2也是完整的,安心了,认为一切ok。上预发布环境,按照正常的业务逻辑,用户去扫码,打开了


www.yxyun.win/test/v3/index, sdk成功,看着一切正常,幸福来得太突然,分享看看,分享出去,点击页面大大的404有木有。


回到微信开发者工具,没有问题啊。再去微信试试,结果还是404。经过长达一个小时的查阅资料和实验,最终修改连接为


var prefixUrl = '${WECHAT_URL!}' + 'web/v321/jfect/${refTrid!}&=';


这时候突然500啦,好高兴,终于是进到了业务系统后台了,不怕你不来,来了就说明至少成功了一半。


到这里得出的结论是(还没有去验证)多次重定向到微信,为了安全微信内部会把?前后进行截取【如var prefixUrl2 = "${BASE_PATH }web/v321/jfect?uuids=${refTrid!}&t=t";


变为 "${BASE_PATH }web/v321”】,以确保安全。举个栗子,某网站被钓鱼,拉取用户去了微信,结果微信检测的域名来去不一样,基于安全考虑给你去掉一部分他们认为潜在的威胁。


最终解决方案是不出现问号传参,造成不需要传参的假象。到后台对请求进行截取处理,找到业务参数。


示例代码


/**


* Support four types of url


* 1: http://abc.com/controllerKey ---> 00


* 2: http://abc.com/controllerKey/para ---> 01


* 3: http://abc.com/controllerKey/method ---> 10


* 4: http://abc.com/controllerKey/method/para ---> 11


* The controllerKey can also contains "/"


* Example: http://abc.com/uvw/xyz/method/para


*/


Action getAction(String url, String[] urlPara) {


Action action = mapping.get(url);


if (action != null) {


return action;


}

// --------


int i = url.lastIndexOf(SLASH);


if (i != -1) {


action = mapping.get(url.substring(0, i));


urlPara[0] = url.substring(i + 1);


}

return action;


}


具体代码实现看自行分析jfinal 以及jfinalAdmin


获取参数

String uuids = this.getPara(0);


if (CheckUtils.isEmpty(uuids)) {


uuids = this.getPara("uuids ");


}

微信扫一扫

第七城市微信公众平台