소프트웨어 개발 키트(외국어 약어: SDK, 외국어 전체 이름: Software Development Kit)는 일반적으로 일부 소프트웨어 엔지니어가 특정 소프트웨어 패키지, 소프트웨어 프레임워크, 하드웨어 플랫폼, 운영 체제, 등. . 이 기사는 주로 PHP에서 WeChat SDK 공유 인터페이스를 구현하는 방법을 공유합니다. 도움이 되기를 바랍니다.
<?php class Wxsdk { private $appId; private $appSecret; /* * 这里为威狮码的公众号的openid和appsecret,如果配置到其他的子商家会出现需要关注威狮码公众号, * 则需要获取数据库的vender表里面的openid和appsecret * */ public function __construct($appId = '自己的appid', $appSecret = '自己的appSecret') { $this->appId = $appId; $this->appSecret = $appSecret; } public function getSignPackage(Request $request) { //接收到前端的转义url转义回来 $url = $_POST; $durl = $url['url']; $durl = urldecode($durl); $jsapiTicket = $this->getJsApiTicket(); $timestamp = time(); $nonceStr = $this->createNonceStr(); // 这里参数的顺序要按照 key 值 ASCII 码升序排序 $string = "jsapi_ticket=$jsapiTicket&noncestr=$nonceStr×tamp=$timestamp&url=$durl"; $signature = sha1($string); $signPackage = [ "appId" => $this->appId, "nonceStr" => $nonceStr, "timestamp" => $timestamp, "url" => $url, "signature" => $signature, "rawString" => $string ]; // var_dump($signPackage);die; throw new SuccessMessage(['msg' => $signPackage]); } private function createNonceStr($length = 16) { $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; $str = ""; for ($i = 0; $i < $length; $i++) { $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1); } return $str; } private function getJsApiTicket() { // jsapi_ticket 应该全局存储与更新,以下代码以写入到文件中做示例 $data = json_decode(file_get_contents("jssdk/jsapi_ticket.json")); if ($data->expire_time < time()) { $accessToken = $this->getAccessToken(); //定义传递的参数数组 $params['type'] = 'jsapi'; $params['access_token'] = $accessToken; $url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=" . $params['access_token'] . "&type=" . $params['type'] . ""; $res = json_decode(curl_get($url, $params)); $ticket = isset($res->ticket) ? $res->ticket : NULL; if ($ticket) { $res->expire_time = time() + 7000; $res->jsapi_ticket = $ticket; $fp = fopen("jssdk/jsapi_ticket.json", "w"); fwrite($fp, json_encode($res)); fclose($fp); } } else { $ticket = $data->jsapi_ticket; } return $ticket; } private function getAccessToken() { // access_token 应该全局存储与更新,以下代码以写入到文件中做示例 $data = json_decode(file_get_contents("jssdk/access_token.json")); if ($data->expire_time < time()) { //定义传递的参数数组 $params['grant_type'] = 'client_credential'; $params['appid'] = $this->appId; $params['secret'] = $this->appSecret; $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=" . $params['grant_type'] . "&appid=" . $params['appid'] . "&secret=" . $params['secret'] . ""; $res = json_decode(curl_post($url, $params)); $access_token = isset($res->access_token) ? $res->access_token : NULL; if ($access_token) { $res->expire_time = time() + 7000; $res->access_token = $access_token; $fp = fopen("jssdk/access_token.json", "w"); fwrite($fp, json_encode($res)); fclose($fp); } } else { $access_token = $data->access_token; } return $access_token; } 前端代码
공식 단계를 확인하고 서명 알고리즘을 확인하세요.
서명 알고리즘이 올바른지 확인하세요. http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign 페이지 도구를 사용하여 확인할 수 있습니다.
구성의 nonceStr(js의 표준 낙타 대문자 S) 및 타임스탬프가 서명에 사용된 해당 noncestr 및 타임스탬프와 일치하는지 확인하세요.
URL이 'http(s)://를 포함하여 페이지의 전체 URL인지 확인하세요(현재 페이지에서 확인하세요. Alert(location.href.split('#')[0])). ' 부분, 그리고 '? '' 뒤에 GET 매개변수 부분이 있지만, '#' 해시 다음 부분은 포함되지 않습니다.
구성의 appid가 jsapi_ticket을 얻는 데 사용된 appid와 일치하는지 확인하세요.
access_token 및 jsapi_ticket을 캐시해야 합니다.
서명을 위해 얻은 URL이 동적으로 얻어졌는지 확인하세요. 동적 페이지의 경우 예제 코드의 PHP 구현을 참조하세요. html의 정적 페이지인 경우 프런트 엔드에서 ajax를 통해 서명을 위해 URL이 백엔드로 전달됩니다. 프런트 엔드에서는 '#' 해시 부분을 제외하고 현재 페이지의 링크를 가져오기 위해 js를 사용해야 합니다. location.href.split('#')[0]에 의해 획득되며 encodeURIComponent, 백그라운드 decodeURIComponent 디코딩이 필요합니다. 페이지가 공유되면 WeChat 클라이언트는 현재 링크의 끝에 다른 매개변수를 추가하기 때문입니다. 동적으로 획득되지 않으면 공유 페이지의 서명이 실패합니다.
위 단계로 문제를 해결할 수 없는 경우(잘못된 서명), URL 문제를 사용하세요. 참고: WeChat 공식 계정은 디버그하는 보안 도메인 이름으로 구성되어야 합니다. -레벨 도메인 이름: 여러 a.xxx.com/b.xxx.com 등을 구성하는 대신 xxx.com).
이유: WeChat은 공유 시 현재 페이지에 여러 매개변수를 추가합니다. sha1에서는 URL 주소가 WeChat이 매개변수를 추가한 후의 주소인지 확인해야 구성: 잘못된 서명이 보고되지 않습니다.
해결 방법: sha1 이전에는 URL이 디코딩 후 육안으로 직접 인식할 수 있는 일반 URL이어야 합니다. 정적 페이지를 사용하는 경우 wx.config를 구성하기 전에 먼저 encodeURIComponent(location.href.split(')를 전달합니다. #')[0] ) decodeURIComponent로 디코딩된 현재 URL 인코딩을 백엔드에 전달합니다. 핵심 코드는 다음과 같습니다.
frontend html 페이지, URL 인코딩:
jQuery.post("/xxx", {"url": encodeURIComponent(window.location.href.split('#')[0]),"t": new Date().getTime()}, function (result) { if (result.errno != 0) { alert("您当前的网络不稳定请稍后再试!"); return; } var shareUrl = result.data.url; wx.config({ debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId: 'xxx', // 必填,公众号的唯一标识 timestamp: result.data.timestamp, // 必填,生成签名的时间戳 nonceStr: result.data.nonceStr, // 必填,生成签名的随机串 signature: result.data.signature,// 必填,签名,见附录1 jsApiList: ['onMenuShareAppMessage','onMenuShareTimeline','onMenuShareQQ','onMenuShareWeibo','onMenuShareQZone'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 });
위 내용은 PHP는 WeChat SDK 공유 인터페이스를 구현합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!