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

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

 

微信业务流程图

 

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

     去微信再回来的目的是:获取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<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】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 ");

 }

0

评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注

点击更换