微信JSSDK如何巧妙地先签名后自定义分享链接——先礼后兵,防止签名不合法

公众网页开发需要分享时用jssdk生成签名需要根据当前完整链接:

/**微信jsapi配置获取
 * @param $gzh array 公众号配置
 * @param $url string 当前url
 * @return array
 */
function get_jsapi_config($gzh, $url)
{
    $getTicket = self::get_ticket($gzh['id']);
    if ($getTicket['code'] <> 0) {
        return DataReturn($getTicket['msg'], -1);
    }
    $time = time();
    $ticket = $getTicket['data']['ticket'];
    $noncestr = createNoncestr(16);
    $str = "jsapi_ticket=$ticket&noncestr=$noncestr&timestamp=$time&url=$url";
    $signature = sha1($str);
    return $jsApiConfig = [
        "appid" => $gzh['appid'],
        "signature" => $signature,
        "timestamp" => $time,
        "noncestr" => $noncestr,
        'link' => $url
    ];
}

//用户信息
$user = ['code'=>'Y666666'];

//对应公众号
$id = 1;
$gzh = common::data_detail('config_gzh', ['id' => $id], 'id,appid');
//当前完整链接
$url = __MY_HTTP__ . '://' . __MY_HOST__ . $_SERVER['REQUEST_URI'];
//获取签名后的配置
$jsApiConfig = get_jsapi_config($gzh, $url);
//获取成功后的处理
if (!empty($jsApiConfig['link'])){
    
    if (!empty($user['code'])){
        //把需要的参数从新拼接,这里以uCode为例,目的是分享时带上用户专码
        $jsApiConfig['link'] = $url.(stripos($url,'?')===false?'?uCode=':'&uCode=').$user['code'];
    }
}


关键点:不能在生成签名前拼接,否则会提示签名不匹配,一定要在签名完成后的link分享链接上进行拼接


上面的核心:

 //把需要的参数从新拼接,这里以uCode为例,目的是分享时带上用户专码
 $jsApiConfig['link'] = $url.(stripos($url,'?')===false?'?uCode=':'&uCode=').$user['code'];


自己昨天开发调试发现运行正常。



其他逻辑细节:


1.用户从某个链接点击进来后通过uCode查找分享者,逻辑忽略

2.如果进入的链接带上了uCode需要先处理分享关系,然后移除uCode后重新调回来,防止签名是时候重复是用原来的uCode,应将新用户的uCode拼接作为新分享者

评论/留言