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