公众网页开发需要分享时用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×tamp=$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拼接作为新分享者