php 微信native扫码支付
生活随笔
收集整理的這篇文章主要介紹了
php 微信native扫码支付
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?Native支付是商戶系統按微信支付協議生成支付二維碼,用戶再用微信“掃一掃”完成支付的模式。該模式適用于PC網站支付、實體店單品或訂單支付、媒體廣告支付等場景。
支付類:
<?php/*** Created by PhpStorm.* User: 827169570@qq.com* Date: 2020/10/16* Time: 23:01*/ namespace app\v1\controller;use app\common\controller\Checking; use think\Controller; use think\Exception;class Wxnative extends Controller {const APPID='';const MCHID='';const KEY='';const NOTIFYURL='';//支付成功異步回調地址//微信支付參數/*** 微信支付-發起訂單.** @param float $totalFee 收款總費用 單位元* @param string $outTradeNo 唯一的訂單號* @param string $orderName 訂單名稱* @param string $notifyUrl 支付結果通知url 不要有問號* @param string $timestamp 訂單發起時間** @return array*/public function wxNativePay($totalFee, $outTradeNo, $body= '充值'){header('Content-type:text/html; Charset=utf-8'); // // $totalFee=0.01; $outTradeNo=time();$orderName = '充值';//獲取微信支付參數//訂單發起時間$timestamp = time();$unified = array('appid' => self::APPID,'attach' => 'pay','body' => $body,'mch_id' => self::MCHID,'nonce_str' => $this->createNonceStr(),'notify_url' => self::NOTIFYURL,'out_trade_no' => $outTradeNo,'spbill_create_ip' => $this->get_client_ip(),'total_fee' => intval($totalFee * 100),//單位 轉為分'trade_type' => 'NATIVE',);$unified['sign'] = $this->getSign($unified, self::KEY);$responseXml = $this->curlPost('https://api.mch.weixin.qq.com/pay/unifiedorder', $this->arrayToXml($unified));//禁止引用外部xml實體libxml_disable_entity_loader(true);$unifiedOrder = simplexml_load_string($responseXml, 'SimpleXMLElement', LIBXML_NOCDATA);if (false === $unifiedOrder) {Checking::response(201,'parse xml error');}if ('SUCCESS' != $unifiedOrder->return_code) {Checking::response(202,$unifiedOrder->return_msg);}if ('SUCCESS' != $unifiedOrder->result_code) {Checking::response(203,$unifiedOrder->err_code);}$codeUrl = (array) ($unifiedOrder->code_url);if (!$codeUrl[0]) {Checking::response(203,'get code_url error');}//生成二維碼 這里利用qrcode類庫生成的二維碼 可根據自己業務進行修改return $this->wePayQRCode($codeUrl[0]);}//獲取隨機字符串-weChatPaypublic 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;}//獲取當前服務器時間-weChatPaypublic function get_client_ip(){if ($_SERVER['REMOTE_ADDR']) {$cip = $_SERVER['REMOTE_ADDR'];} elseif (getenv('REMOTE_ADDR')) {$cip = getenv('REMOTE_ADDR');} elseif (getenv('HTTP_CLIENT_IP')) {$cip = getenv('HTTP_CLIENT_IP');} else {$cip = 'unknown';}return $cip;}//獲取簽名public function getSign($params, $key){ksort($params, SORT_STRING);$unSignParaString = $this->formatQueryParaMap($params, false);$signStr = strtoupper(md5($unSignParaString.'&key='.$key));return $signStr;}//生成簽名public 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;}//發送微信支付請求public 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); //設置cURL允許執行的最長秒數if (!empty($options)) {curl_setopt_array($ch, $options);}//https請求 不驗證證書和hostcurl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);$data = curl_exec($ch);curl_close($ch);return $data;}//將數組轉為xmlpublic 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 function wePayQRCode($url){include '../extend/wxPay/example/phpqrcode/phpqrcode.php';$value = $url;//二維碼內容$errorCorrectionLevel = 'L';//容錯級別$matrixPointSize = 5;//生成圖片大小//生成二維碼圖片try {$filename = 'qrcode/'.'local'.time().'.png';\QRcode::png($value, $filename, $errorCorrectionLevel, $matrixPointSize, 2);$QR = $filename;//已經生成的原始二維碼圖片文件$QR = imagecreatefromstring(file_get_contents($QR));//輸出圖片imagepng($QR, 'qrcode/'.'qrcode.png');imagedestroy($QR);return $filename;}catch (Exception $exception){Checking::response($exception->getCode(),$exception->getMessage());}} }?調用支付
$wx= new Wxnative();$order_num=Checking::orderNum();$payUrl= API_URL.'/'.$wx->wxNativePay($money,$order_num);回調數據接收
public function wxpayNotify(){$params = trim(file_get_contents('php://input'));$xml = (array)simplexml_load_string( $params, 'SimpleXMLElement', LIBXML_NOCDATA ); //將微信返回的XML 轉換成數組if ('SUCCESS' == $xml['return_code']) {//成功回調異步通知地址//訂單支付成功$data['out_trade_no'] = $xml['out_trade_no'];$data['pay_number'] = $xml['openid'];$data['trade_num'] = $xml['transaction_id'];$data['pay_time'] = $xml['time_end'];Checking::writeLog(json_encode($data),'回調開始','newWxpay.txt');Db::startTrans();try {#業務邏輯} else {Db::rollback();Checking::writeLog('異步通知地址回調失敗','異步通知地址回調失敗','newWxpay.txt');} }?
總結
以上是生活随笔為你收集整理的php 微信native扫码支付的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机核心组成
- 下一篇: php 计费系统设计,php超市收费系统