最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

php實(shí)現(xiàn)微信原生支付(掃碼支付)功能

 更新時(shí)間:2018年05月30日 10:01:57   作者:織夢(mèng)貓2  
這篇文章主要為大家詳細(xì)介紹了php實(shí)現(xiàn)微信原生支付,掃碼支付功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

網(wǎng)上的很多PHP微信掃碼支付接入教程都頗為復(fù)雜,且需要配置和引入較多的文件,本人通過整理后給出一個(gè)單文件版的,只有200行代碼,希望可以給各位想接入微信掃碼支付的帶來些許幫助和借鑒意義。

直接運(yùn)行該文件即可得到一個(gè)支付二維碼的圖片。

需要注意的事項(xiàng):

1.該文件需放到支付授權(quán)目錄下,可以在微信支付商戶平臺(tái)->產(chǎn)品中心->開發(fā)配置中設(shè)置。
2.如提示簽名錯(cuò)誤可以通過微信支付簽名驗(yàn)證工具進(jìn)行驗(yàn)證:微信公眾平臺(tái)支付接口調(diào)試工具

代碼如下:

<?php
header('Content-type:text/html; Charset=utf-8');
$mchid = 'xxxxx';     //微信支付商戶號(hào) PartnerID 通過微信支付商戶資料審核后郵件發(fā)送
$appid = 'xxxxx'; //公眾號(hào)APPID 通過微信支付商戶資料審核后郵件發(fā)送
$apiKey = 'xxxxx';  //https://pay.weixin.qq.com 帳戶設(shè)置-安全設(shè)置-API安全-API密鑰-設(shè)置API密鑰
$wxPay = new WxpayService($mchid,$appid,$apiKey);
$outTradeNo = uniqid();   //你自己的商品訂單號(hào)
$payAmount = 0.01;     //付款金額,單位:元
$orderName = '支付測(cè)試';  //訂單標(biāo)題
$notifyUrl = 'https://www.xxx.com/wx/';   //付款成功后的回調(diào)地址(不要有問號(hào))
$payTime = time();   //付款時(shí)間
$arr = $wxPay->createJsBizPackage($payAmount,$outTradeNo,$orderName,$notifyUrl,$payTime);
//生成二維碼
$url = 'http://qr.liantu.com/api.php?text='.$arr['code_url'];
echo "<img src='{$url}' style='width:300px;'>";

class WxpayService
{
  protected $mchid;
  protected $appid;
  protected $apiKey;

  public function __construct($mchid, $appid, $key)
  {
    $this->mchid = $mchid;
    $this->appid = $appid;
    $this->apiKey = $key;
  }

  /**
   * 發(fā)起訂單
   * @param float $totalFee 收款總費(fèi)用 單位元
   * @param string $outTradeNo 唯一的訂單號(hào)
   * @param string $orderName 訂單名稱
   * @param string $notifyUrl 支付結(jié)果通知url 不要有問號(hào)
   * @param string $timestamp 訂單發(fā)起時(shí)間
   * @return array
   */
  public function createJsBizPackage($totalFee, $outTradeNo, $orderName, $notifyUrl, $timestamp)
  {
    $config = array(
      'mch_id' => $this->mchid,
      'appid' => $this->appid,
      'key' => $this->apiKey,
    );
    $orderName = iconv('GBK','UTF-8',$orderName);
    $unified = array(
      'appid' => $config['appid'],
      'attach' => 'pay',       //商家數(shù)據(jù)包,原樣返回,如果填寫中文,請(qǐng)注意轉(zhuǎn)換為utf-8
      'body' => $orderName,
      'mch_id' => $config['mch_id'],
      'nonce_str' => self::createNonceStr(),
      'notify_url' => $notifyUrl,
      'out_trade_no' => $outTradeNo,
      'spbill_create_ip' => '127.0.0.1',
      'total_fee' => intval($totalFee * 100),    //單位 轉(zhuǎn)為分
      'trade_type' => 'NATIVE',
    );
    $unified['sign'] = self::getSign($unified, $config['key']);
    $responseXml = self::curlPost('https://api.mch.weixin.qq.com/pay/unifiedorder', self::arrayToXml($unified));
    $unifiedOrder = simplexml_load_string($responseXml, 'SimpleXMLElement', LIBXML_NOCDATA);
    if ($unifiedOrder === false) {
      die('parse xml error');
    }
    if ($unifiedOrder->return_code != 'SUCCESS') {
      die($unifiedOrder->return_msg);
    }
    if ($unifiedOrder->result_code != 'SUCCESS') {
      die($unifiedOrder->err_code);
    }
    $codeUrl = (array)($unifiedOrder->code_url);
    if(!$codeUrl[0]) exit('get code_url error');
    $arr = array(
      "appId" => $config['appid'],
      "timeStamp" => $timestamp,
      "nonceStr" => self::createNonceStr(),
      "package" => "prepay_id=" . $unifiedOrder->prepay_id,
      "signType" => 'MD5',
      "code_url" => $codeUrl[0],
    );
    $arr['paySign'] = self::getSign($arr, $config['key']);
    return $arr;
  }


  public function notify()
  {
    $config = array(
      'mch_id' => $this->mchid,
      'appid' => $this->appid,
      'key' => $this->apiKey,
    );
    $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];

    $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
    if ($postObj === false) {
      die('parse xml error');
    }
    if ($postObj->return_code != 'SUCCESS') {
      die($postObj->return_msg);
    }
    if ($postObj->result_code != 'SUCCESS') {
      die($postObj->err_code);
    }
    $arr = (array)$postObj;
    unset($arr['sign']);
    if (self::getSign($arr, $config['key']) == $postObj->sign) {
      echo '<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>';
      return $postObj;
    }
  }

  /**
   * curl get
   *
   * @param string $url
   * @param array $options
   * @return mixed
   */
  public static function curlGet($url = '', $options = array())
  {
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_TIMEOUT, 30);
    if (!empty($options)) {
      curl_setopt_array($ch, $options);
    }
    //https請(qǐng)求 不驗(yàn)證證書和host
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
    $data = curl_exec($ch);
    curl_close($ch);
    return $data;
  }

  public static function curlPost($url = '', $postData = '', $options = array())
  {
    if (is_array($postData)) {
      $postData = http_build_query($postData);
    }
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
    curl_setopt($ch, CURLOPT_TIMEOUT, 30); //設(shè)置cURL允許執(zhí)行的最長(zhǎng)秒數(shù)
    if (!empty($options)) {
      curl_setopt_array($ch, $options);
    }
    //https請(qǐng)求 不驗(yàn)證證書和host
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
    $data = curl_exec($ch);
    curl_close($ch);
    return $data;
  }

  public static 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;
  }

  public static function arrayToXml($arr)
  {
    $xml = "<xml>";
    foreach ($arr as $key => $val) {
      if (is_numeric($val)) {
        $xml .= "<" . $key . ">" . $val . "</" . $key . ">";
      } else
        $xml .= "<" . $key . "><![CDATA[" . $val . "]]></" . $key . ">";
    }
    $xml .= "</xml>";
    return $xml;
  }
  /**
   * 獲取簽名
   */
  public static function getSign($params, $key)
  {
    ksort($params, SORT_STRING);
    $unSignParaString = self::formatQueryParaMap($params, false);
    $signStr = strtoupper(md5($unSignParaString . "&key=" . $key));
    return $signStr;
  }

  protected static function formatQueryParaMap($paraMap, $urlEncode = false)
  {
    $buff = "";
    ksort($paraMap);
    foreach ($paraMap as $k => $v) {
      if (null != $v && "null" != $v) {
        if ($urlEncode) {
          $v = urlencode($v);
        }
        $buff .= $k . "=" . $v . "&";
      }
    }
    $reqPar = '';
    if (strlen($buff) > 0) {
      $reqPar = substr($buff, 0, strlen($buff) - 1);
    }
    return $reqPar;
  }
}

github下載地址:weixinPay

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

  • php獲取指定日期之間的各個(gè)周和月的起止時(shí)間

    php獲取指定日期之間的各個(gè)周和月的起止時(shí)間

    本文推薦給大家一個(gè)php類文件,可以根據(jù)指定日期獲取所在周的起始時(shí)間和結(jié)束時(shí)間,并附上使用實(shí)例,有需要的小伙伴參考下吧
    2014-11-11
  • CodeIgniter框架中_remap()使用方法2例

    CodeIgniter框架中_remap()使用方法2例

    這篇文章主要介紹了CodeIgniter中的_remap()使用方法2例,需要的朋友可以參考下
    2014-03-03
  • Laravel框架實(shí)現(xiàn)的使用smtp發(fā)送郵件功能示例

    Laravel框架實(shí)現(xiàn)的使用smtp發(fā)送郵件功能示例

    這篇文章主要介紹了Laravel框架實(shí)現(xiàn)的使用smtp發(fā)送郵件功能,結(jié)合實(shí)例形式分析了Laravel框架相關(guān)配置及郵件發(fā)送操作技巧,需要的朋友可以參考下
    2019-03-03
  • ThinkPHP快速入門實(shí)例教程之?dāng)?shù)據(jù)分頁

    ThinkPHP快速入門實(shí)例教程之?dāng)?shù)據(jù)分頁

    這篇文章主要介紹了ThinkPHP快速入門實(shí)例教程的數(shù)據(jù)分頁實(shí)現(xiàn)過程,需要的朋友可以參考下
    2014-07-07
  • 關(guān)于UEditor編輯器遠(yuǎn)程圖片上傳失敗的解決辦法

    關(guān)于UEditor編輯器遠(yuǎn)程圖片上傳失敗的解決辦法

    因?yàn)閱渭兿矚g UEditor 的界面,于是把項(xiàng)目中原先的編輯器進(jìn)行的替換,但在后續(xù)操作中發(fā)現(xiàn)一些問題,就是遠(yuǎn)程圖片上傳
    2012-08-08
  • CI框架實(shí)現(xiàn)框架前后端分離的方法詳解

    CI框架實(shí)現(xiàn)框架前后端分離的方法詳解

    這篇文章主要介紹了CI框架實(shí)現(xiàn)框架前后端分離的方法,結(jié)合實(shí)例形式較為詳細(xì)的分析了CI框架前后端分離的相關(guān)視圖、控制器設(shè)置與擴(kuò)展等操作技巧,需要的朋友可以參考下
    2016-12-12
  • PHP實(shí)現(xiàn)多關(guān)鍵字加亮功能

    PHP實(shí)現(xiàn)多關(guān)鍵字加亮功能

    關(guān)鍵字加亮可以更好的幫助閱讀,本篇文章主要PHP實(shí)現(xiàn)多關(guān)鍵字加亮功能,具有一定的參考價(jià)值,有需要的可以看一下。
    2016-10-10
  • php寫app接口并返回json數(shù)據(jù)的實(shí)例(分享)

    php寫app接口并返回json數(shù)據(jù)的實(shí)例(分享)

    下面小編就為大家?guī)硪黄猵hp寫app接口并返回json數(shù)據(jù)的實(shí)例(分享)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-05-05
  • 用 Composer構(gòu)建自己的 PHP 框架之設(shè)計(jì) MVC

    用 Composer構(gòu)建自己的 PHP 框架之設(shè)計(jì) MVC

    幾乎所有人都是通過學(xué)習(xí)某個(gè)框架來了解 MVC 的,這樣可能框架用的很熟,一旦離了框架一個(gè)簡(jiǎn)單的頁面都寫不了,更不要說自己設(shè)計(jì) MVC 架構(gòu)了,其實(shí)這里面也沒有那么多門道,原理非常清晰
    2014-10-10
  • 最新評(píng)論

    布拖县| 琼中| 太谷县| 桦南县| 九台市| 广汉市| 永川市| 红桥区| 将乐县| 尼玛县| 友谊县| 法库县| 湖北省| 肥西县| 永平县| 麻栗坡县| 韩城市| 高雄市| 平阳县| 安庆市| 旌德县| 宁晋县| 大兴区| 兴海县| 泊头市| 乐山市| 佛坪县| 南安市| 大英县| 乌拉特中旗| 马龙县| 扬州市| 剑阁县| 朝阳区| 苍山县| 成安县| 乐陵市| 年辖:市辖区| 平利县| 桦川县| 泉州市|