微信业务流程图
为什么要去微信再回到自己的服务器?通过什么方式去微信?
去微信再回来的目的是:获取code值,根据code换取access_token最终获取微信用户的openid。这样去微信然后由微信返回自己的业务服务器
/**
* 生成Authorize链接
* appId 应用id
* redirectUri 回跳地址
* state 重定向后会带上state参数,开发者可以填写a-zA-Z0-9的参数值,最多128字节
* snsapiBase snsapi_base(不弹出授权页面,只能拿到用户openid)snsapi_userinfo(弹出授权页面,这个可以通过 openid 拿到昵称、性别、所在地)
* url
*/
public static String getAuthorizeURL(String appId, String redirectUri, String state, boolean snsapiBase) {
Map<String, String> params = new HashMap<String, String>();
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】,此时在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。上预发布环境,按照正常的业务逻辑,用户去扫码,打开了
, 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 ");
}