<address id="ousso"></address>
<form id="ousso"><track id="ousso"><big id="ousso"></big></track></form>
  1. php微信支付之APP支付方法

    時間:2025-10-09 11:40:42 php語言

    php微信支付之APP支付方法

      本文實例講述了微信開放平臺移動應用集成微信支付功能。分享給大家供大家參考。具體分析如下,更多消息請關注應屆畢業生網!
      WechatAppPay文件代碼如下:
      ?
      <?php
      namespace common\services\WechatPay;
      class WechatAppPay extends WechatPayBase
      {
      /pic/div>
      public $package = [];
      /pic/div>
      public $notify = [];
      /pic/div>
      protected $config = [];
      /pic/div>
      protected $file;
      /pic/div>
      protected $accessToken;
      /pic/div>
      const ACCESS_TOKEN_URL = '/pic/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s';
      /pic/div>
      const POST_ORDER_URL = '/pic/pay/genprepay?access_token=%s';
      public function __construct()
      {
      $this->file = __DIR__ . '/payAccessToken.txt';
      }
      /**
      * 創建APP支付最終返回參數
      * @throws \Exception
      * @return multitype:string NULL
      */
      public function createAppPayData()
      {
      $this->generateConfig();
      $prepayid = $this->getPrepayid();
      try{
      $array = [
      'appid' => $this->appid,
      'appkey' => $this->paySignkey,
      'noncestr' => $this->getRandomStr(),
      'package' => 'Sign=WXPay',
      'partnerid' => $this->partnerId,
      'prepayid' => $prepayid,
      'timestamp' => (string)time(),
      ];
      $array['sign'] = $this->sha1Sign($array);
      unset($array['appkey']);
      } catch(\Exception $e) {
      throw new \Exception($e->getMessage());
      }
      return $array;
      }
      /**
      * 驗證支付成功后的通知參數
      *
      * @throws \Exception
      * @return boolean
      */
      public function verifyNotify()
      {
      try{
      $staySignStr = $this->notify;
      unset($staySignStr['sign']);
      $sign = $this->signData($staySignStr);
      return $this->notify['sign'] === $sign;
      } catch(\Exception $e) {
      throw new \Exception($e->getMessage());
      }
      }
      /**
      * 魔術方法,給添加支付參數進來
      *
      * @param string $name  參數名
      * @param string $value  參數值
      */
      public function __set($name, $value)
      {
      $this->$name = $value;
      }
      /**
      * 設置access token
      * @param string $token
      * @throws \Exception
      * @return boolean
      */
      public function setAccessToken()
      {
      try{
      if(!file_exists($this->file) || !is_file($this->file)) {
      $f = fopen($this->file, 'a');
      fclose($f);
      }
      $content = file_get_contents($this->file);
      if(!empty($content)) {
      $info = json_decode($content, true);
      if( time() - $info['getTime'] < 7150 ) {
      $this->accessToken = $info['accessToken'];
      return true;
      }
      }
      /pic/div>
      $this->outputAccessTokenToFile();
      } catch(\Exception $e) {
      throw new \Exception($e->getMessage());
      }
      return true;
      }
      /**
      * 寫入access token 到文件
      * @throws \Exception
      * @return boolean
      */
      protected function outputAccessTokenToFile()
      {
      try{
      $f = fopen($this->file, 'wb');
      $token = [
      'accessToken' => $this->getAccessToken(),
      'getTime' => time(),
      ];
      flock($f, LOCK_EX);
      fwrite($f, json_encode($token));
      flock($f, LOCK_UN);
      fclose($f);
      $this->accessToken = $token['accessToken'];
      } catch(\Exception $e) {
      throw new \Exception($e->getMessage());
      }
      return true;
      }
      /**
      * 取access token
      *
      * @throws \Exception
      * @return string
      */
      protected function getAccessToken()
      {
      $url = sprintf(self::ACCESS_TOKEN_URL, $this->appid, $this->appSecret);
      $result = json_decode( $this->getUrl($url), true );
      if(isset($result['errcode'])) {
      throw new \Exception("get access token failed:{$result['errmsg']}");
      }
      return $result['access_token'];
      }
      /**
      * 取預支付會話標識
      *
      * @throws \Exception
      * @return string
      */
      protected function getPrepayid()
      {
      $data = json_encode($this->config);
      $url = sprintf(self::POST_ORDER_URL, $this->accessToken);
      $result = json_decode( $this->postUrl($url, $data), true );
      if( isset($result['errcode']) && $result['errcode'] != 0 ) {
      throw new \Exception($result['errmsg']);
      }
      if( !isset($result['prepayid']) ) {
      throw new \Exception('get prepayid failed, url request error.');
      }
      return $result['prepayid'];
      }
      /**
      * 組裝預支付參數
      *
      * @throws \Exception
      */
      protected function generateConfig()
      {
      try{
      $this->config = [
      'appid' => $this->appid,
      'traceid' => $this->traceid,
      'noncestr' => $this->getRandomStr(),
      'timestamp' => time(),
      'package' => $this->generatePackage(),
      'sign_method' => $this->sign_method,
      ];
      $this->config['app_signature'] = $this->generateSign();
      } catch(\Exception $e) {
      throw new \Exception($e->getMessage());
      }
      }
      /**
      * 生成package字段
      *
      * 生成規則:
      * 1、生成sign的值signValue
      * 2、對package參數再次拼接成查詢字符串,值需要進行urlencode
      * 3、將sign=signValue拼接到2生成的字符串后面得到最終的package字符串
      *
      * 第2步urlencode空格需要編碼成%20而不是+
      *
      * RFC 1738會把 空格編碼成+
      * RFC 3986會把空格編碼成%20
      *
      * @return string
      */
      protected function generatePackage()
      {
      $this->package['sign'] = $this->signData($this->package);
      return http_build_query($this->package, '', '&', PHP_QUERY_RFC3986);
      }
      /**
      * 生成簽名
      *
      * @return string
      */
      protected function generateSign()
      {
      $signArray = [
      'appid' => $this->appid,
      'appkey' => $this->paySignkey,
      'noncestr' => $this->config['noncestr'],
      'package' => $this->config['package'],
      'timestamp' => $this->config['timestamp'],
      'traceid' => $this->traceid,
      ];
      return $this->sha1Sign($signArray);
      }
      /**
      * 簽名數據
      *
      * 生成規則:
      * 1、字典排序,拼接成查詢字符串格式,不需要urlencode
      * 2、上一步得到的字符串最后拼接上key=paternerKey
      * 3、MD5哈希字符串并轉換成大寫得到sign的值signValue
      *
      * @param array $data 待簽名數據
      * @return string 最終簽名結果
      */
      protected function signData($data)
      {
      ksort($data);
      $str = $this->arrayToString($data);
      $str .= "&key={$this->partnerKey}";
      return strtoupper( $this->signMd5($str) );
      }
      /**
      * sha1簽名
      * 簽名規則
      * 1、字典排序
      * 2、拼接查詢字符串
      * 3、sha1運算
      *
      * @param array $arr
      * @return string
      */
      protected function sha1Sign($arr)
      {
      ksort($arr);
      return sha1( $this->arrayToString($arr) );
      }
      }
      希望本文所述對大家的php程序設計有所幫助。

    【php微信支付之APP支付方法】相關文章:

    PHP后臺微信支付使用方法02-11

    PHP開發微信支付實例代碼10-13

    php銀聯網頁支付實現方法07-24

    PHP如何開發paypal支付插件03-09

    php支付寶接口用法分析12-08

    整合支付寶即時交易+掃碼支付03-08

    電子支付系統的概述11-19

    GMAT考試報名費支付方法201602-26

    php學習之php配置03-11

    <address id="ousso"></address>
    <form id="ousso"><track id="ousso"><big id="ousso"></big></track></form>
    1. 日日做夜狠狠爱欧美黑人