>백엔드 개발 >PHP 튜토리얼 >PHP는 사진 앨범을 선택하고 사진을 찍어 업로드하는 WeChat JS-SDK 인터페이스 방식을 구현합니다.

PHP는 사진 앨범을 선택하고 사진을 찍어 업로드하는 WeChat JS-SDK 인터페이스 방식을 구현합니다.

墨辰丷
墨辰丷원래의
2018-05-29 17:43:222056검색

이 글에서는 주로 PHP에서 WeChat JS-SDK 인터페이스를 구현하여 앨범을 선택하고, 사진을 찍고, 업로드하는 방법을 소개합니다. 여기에는 PHP WeChat 인터페이스의 호출 기술이 포함됩니다. 필요한 친구는 이를 참조할 수 있습니다.

이해: WeChat 업로드 인터페이스는 사진을 찍거나 로컬 사진을 선택하여 WeChat 서버에 업로드하고 ID를 얻은 다음 토큰과 이 ID를 통해 사진을 가져와 서버에 저장하는 것입니다.

렌더링:

WeChat js 인터페이스를 통해 기본 프로그램을 호출합니다.

js 파일을 도입하고 구성해야 합니다.

<script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>
wx.config({
  debug: false,
  appId: &#39;wxed7996e9ad58345d&#39;,
  timestamp: 1449717454,
  nonceStr: &#39;asdfasdfasdf&#39;,
  signature: &#39;b74fb4ab4790172d2ab7e58f0051a1523aaa4803&#39;,
  jsApiList: [
    &#39;chooseImage&#39;,
    &#39;uploadImage&#39;
  ]
});

여기서 appId는 WeChat 공개 플랫폼 ID이고, timestamp는 현재 타임스탬프이고, nonceStr은 임의의 문자열이고, 서명은 서명입니다.

서명은 가장 중요한 매개변수입니다. 그것을 얻으려면 많은 단계가 필요합니다.

먼저 2시간 동안 유지되고 하루에 2000번 획득이 허용되는 access_token을 받으세요. 초과할 경우 획득이 불가능합니다.

// 获取access_token 两小时有效
private function get_access_token(){
    $appid = C(&#39;oauth_config.appid&#39;);
    $appsecret = C(&#39;oauth_config.appsecret&#39;);
    $url = &#39;https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=&#39;.$appid.&#39;&secret=&#39;.$appsecret;
    $rurl = file_get_contents($url);
    $rurl = json_decode($rurl,true);
    if(array_key_exists(&#39;errcode&#39;,$rurl)){
      return false;
    }else{
      $access_token = $rurl[&#39;access_token&#39;];
      return $access_token;
    }
}

그런 다음 jsticket을 가져옵니다

// 获取jsticket 两小时有效
private function getjsticket(){ // 只允许本类调用,继承的都不可以调用,公开调用就更不可以了
    $access_token = $this->get_access_token();
    $url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=".$access_token."&type=jsapi"; // 两小时有效
    $rurl = file_get_contents($url);
    $rurl = json_decode($rurl,true);
    if($rurl[&#39;errcode&#39;] != 0){
      return false;
    }else{
      $jsticket = $rurl[&#39;ticket&#39;];
      return $jsticket;
    }
}

그런 다음 여러 매개 변수를 연결하고 암호화하여 구성되는 서명을 가져오면 효과적입니다.

// 获取 signature
private function getsignature(){
    $noncestr = &#39;&#39;;
    $jsapi_ticket = $this->getjsticket();
    $timestamp = time();
    $url = &#39;http://zhudianbao.diandodo.com/index.php?g=Opener&m=Merchant&a=open&#39;;
    $string1 = &#39;jsapi_ticket=&#39;.$jsapi_ticket.&#39;&noncestr=&#39;.$noncestr.&#39;&timestamp=&#39;.$timestamp.&#39;&url=&#39;.$url;
    $signature = sha1($string1);
    return $signature;
}

구성 후 사용하시면 됩니다. 저는 두 가지 기능을 사용했는데, 하나는 사진을 선택하는 것이고 다른 하나는 사진을 업로드하는 것입니다.

function chooseImage(obj){
  // 选择张片
  wx.chooseImage({
    count: 1, // 默认9
    sizeType: [&#39;original&#39;, &#39;compressed&#39;], // 可以指定是原图还是压缩图,默认二者都有
    sourceType: [&#39;album&#39;, &#39;camera&#39;], // 可以指定来源是相册还是相机,默认二者都有
    success: function(res) {
      var localIds = res.localIds; // 返回选定照片的本地ID列表,localId可以作为img标签的src属性显示图片
      $(obj).attr(&#39;src&#39;, localIds);
      // 上传照片
      wx.uploadImage({
        localId: &#39;&#39; + localIds,
        isShowProgressTips: 1,
        success: function(res) {
          serverId = res.serverId;
          $(obj).next().val(serverId); // 把上传成功后获取的值附上
        }
      });
    }
  });
}

사진에서 반환된 localId를 선택하는 것은 매우 흥미롭습니다. 업로드에 사용할 수 있고 이미지를 표시하기 위해 img의 src 속성에 배치할 수 있습니다.

업로드가 성공한 후 serverId를 얻으세요. 이 ID를 통해 WeChat 서버에 업로드된 이미지 파일을 다운로드하고 자신의 서버에 저장할 수 있습니다.

// 获取图片地址
private function getmedia($access_token,$media_id,$foldername){
    $url = "http://file.api.weixin.qq.com/cgi-bin/media/get?access_token=".$access_token."&media_id=".$media_id;
    if (!file_exists("./Uploads/User_cert/".$foldername)) {
      mkdir("./Uploads/User_cert/".$foldername, 0777, true);
    }
    $targetName = &#39;./Uploads/User_cert/&#39;.$foldername.&#39;/&#39;.date(&#39;YmdHis&#39;).rand(1000,9999).&#39;.jpg&#39;;
    $ch = curl_init($url); // 初始化
    $fp = fopen($targetName, &#39;wb&#39;); // 打开写入
    curl_setopt($ch, CURLOPT_FILE, $fp); // 设置输出文件的位置,值是一个资源类型
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_exec($ch);
    curl_close($ch);
    fclose($fp);
    return $targetName;
}

여러 사진이 동시에 업로드될 수 있으므로 사진 이름이 같은 것을 방지하려면 임의의 숫자를 추가하세요.

$targetName = &#39;./Uploads/User_cert/&#39;.$foldername.&#39;/&#39;.date(&#39;YmdHis&#39;).rand(1000,9999).&#39;.jpg&#39;;

이 serverId는 양식 형태로 서버에 제출된 후 파일에 기록되고 주소를 얻어 서버에 저장됩니다.

WeChat의 js와 jquery는 충돌하지 않으며 함께 사용할 수 있습니다.

첨부한 것은 멋진 JSSDK 수업입니다

<?php
class JSSDK {
 private $appId;
 private $appSecret;
 public function __construct($appId, $appSecret) {
  $this->appId = $appId;
  $this->appSecret = $appSecret;
 }
 public function getSignPackage() {
  $jsapiTicket = $this->getJsApiTicket();
  // 注意 URL 一定要动态获取,不能 hardcode.
  $protocol = (!empty($_SERVER[&#39;HTTPS&#39;]) && $_SERVER[&#39;HTTPS&#39;] !== &#39;off&#39; || $_SERVER[&#39;SERVER_PORT&#39;] == 443) ? "https://" : "http://";
  $url = "$protocol$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
  $timestamp = time();
  $nonceStr = $this->createNonceStr();
  // 这里参数的顺序要按照 key 值 ASCII 码升序排序
  $string = "jsapi_ticket=$jsapiTicket&noncestr=$nonceStr&timestamp=$timestamp&url=$url";
  $signature = sha1($string);
  $signPackage = array(
   "appId"   => $this->appId,
   "nonceStr" => $nonceStr,
   "timestamp" => $timestamp,
   "url"    => $url,
   "signature" => $signature,
   "rawString" => $string
  );
  return $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("jsapi_ticket.json"));
  if ($data->expire_time < time()) {
   $accessToken = $this->getAccessToken();
   // 如果是企业号用以下 URL 获取 ticket
   // $url = "https://qyapi.weixin.qq.com/cgi-bin/get_jsapi_ticket?access_token=$accessToken";
   $url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token=$accessToken";
   $res = json_decode($this->httpGet($url));
   $ticket = $res->ticket;
   if ($ticket) {
    $data->expire_time = time() + 7000;
    $data->jsapi_ticket = $ticket;
    $fp = fopen("jsapi_ticket.json", "w");
    fwrite($fp, json_encode($data));
    fclose($fp);
   }
  } else {
   $ticket = $data->jsapi_ticket;
  }
  return $ticket;
 }
 private function getAccessToken() {
  // access_token 应该全局存储与更新,以下代码以写入到文件中做示例
  $data = json_decode(file_get_contents("access_token.json"));
  if ($data->expire_time < time()) {
   // 如果是企业号用以下URL获取access_token
   // $url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=$this->appId&corpsecret=$this->appSecret";
   $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$this->appId&secret=$this->appSecret";
   $res = json_decode($this->httpGet($url));
   $access_token = $res->access_token;
   if ($access_token) {
    $data->expire_time = time() + 7000;
    $data->access_token = $access_token;
    $fp = fopen("access_token.json", "w");
    fwrite($fp, json_encode($data));
    fclose($fp);
   }
  } else {
   $access_token = $data->access_token;
  }
  return $access_token;
 }
 private function httpGet($url) {
  $curl = curl_init();
  curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($curl, CURLOPT_TIMEOUT, 500);
  // 为保证第三方服务器与微信服务器之间数据传输的安全性,所有微信接口采用https方式调用,必须使用下面2行代码打开ssl安全校验。
  // 如果在部署过程中代码在此处验证失败,请到 http://curl.haxx.se/ca/cacert.pem 下载新的证书判别文件。
  curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);
  curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, true);
  curl_setopt($curl, CURLOPT_URL, $url);
  $res = curl_exec($curl);
  curl_close($curl);
  return $res;
 }
}

위는 이 글의 전체 내용입니다. 모든 분들의 학습에 도움이 되기를 바랍니다.


관련 권장 사항:

PHP 이메일 사용 방법

PHP 쿠키 이해 및 사용

PHP

PHP을 사용하세요. 캐싱 관련 지식을 이해하고 적용하는 세션

위 내용은 PHP는 사진 앨범을 선택하고 사진을 찍어 업로드하는 WeChat JS-SDK 인터페이스 방식을 구현합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.