<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      uniapp+thinkphp5實現微信支付(JSAPI支付)

      前言

      統一支付是JSAPI/NATIVE/APP各種支付場景下生成支付訂單,返回預支付訂單號的接口,目前微信支付所有場景均使用這一接口。下面介紹的是其中JSAPI的支付實現流程與uniapp喚起微信支付流程

      流程實現(后端)(PHP)

      1. 創建Wechatpay.php文件,放到指定文件目錄下(我是放到了extend目錄)
      <?php
      
        class Wechatpay{
      
      
            /**
             * 模擬提交參數,支持https提交 可用于各類api請求
             * @param string $url : 提交的地址
             * @param array $data :POST數組
             * @param string $method : POST/GET,默認GET方式
             * @return mixed
             */
            function curl_https($url, $xml='', $useCert=false){
      
                $ch = curl_init();
                //設置超時
                curl_setopt($ch, CURLOPT_TIMEOUT, 30);
                curl_setopt($ch,CURLOPT_URL, $url);
      
                //設置header
                curl_setopt($ch, CURLOPT_HEADER, FALSE);
                //要求結果為字符串且輸出到屏幕上
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
      
                if(stripos($url,"https://")!==FALSE){
                    curl_setopt($ch, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1);
                    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
                    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
                }else{
                    curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,TRUE);
                    curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,2);//嚴格校驗
                }
                if($useCert == true){
                    //設置證書
                    //使用證書:cert 與 key 分別屬于兩個.pem文件
                    curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM');
                    curl_setopt($ch,CURLOPT_SSLCERT,"");
                    curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');
                    curl_setopt($ch,CURLOPT_SSLKEY,"");
                }
                //post提交方式
                curl_setopt($ch, CURLOPT_POST, TRUE);
                curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
                //運行curl
                $data = curl_exec($ch);
                //返回結果
                if($data){
                    curl_close($ch);
                    return $data;
                } else {
                    $error = curl_errno($ch);
                    curl_close($ch);
                    //echo $error;
                }
      
            }
      
            /**
             *
             * 拼接簽名字符串
             * @param array $urlObj
             *
             * @return 返回已經拼接好的字符串
             */
            function ToUrlParams($urlObj)
            {
                $buff = "";
                foreach ($urlObj as $k => $v)
                {
                    if($k != "sign"){
                        $buff .= $k . "=" . $v . "&";
                    }
                }
      
                $buff = trim($buff, "&");
                return $buff;
            }
      
      
            //數組轉XML
            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;
            }
      
            //將XML轉為array
            function xmlToArray($xml)
            {
                //禁止引用外部xml實體
                libxml_disable_entity_loader(true);
                $values = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
                return $values;
            }
      
            /**
             * 獲取隨機字符串
             * @return mixed
             */
            function getRandString($len=12,$str='ABCDEFGHIJKLMNOPQRSTUVWYXZabcdefghijklmnopqrstuvwyxz1234567890'){
                $strlen=strlen($str)-1;
                $string='';
                for ($i=0; $i < $len; $i++) {
                    $r=rand(1,$strlen);
                    $string=$string.$str[$r];
                }
                return $string;
            }
      
      
        }
      

      2.定義公共變量

      private $config = array(
              'appid' => "wxa******",    /*微信小程序的appid*/
              'appid_app' => "wx******",    /*微信開放平臺上的應用id*/
              'mch_id' => "*******",   /*微信申請成功之后郵件中的商戶id*/
              'api_key' => "*************",    /*在微信商戶平臺上自己設定的api密鑰 32位*/
              'notify_url' => 'https://***',  /*支付回調地址,確保可以訪問*/
          );
      

      3.支付接口

      public function JSPay($busid,$price,$code,$type,$attach){
              
              $businessInfo=$this->BusinessModel->find($busid);
              Loader::import('wechatpay.Wechatpay', EXTEND_PATH,".php");
                  $wechatpay = new \Wechatpay();
                  $url='https://api.mch.weixin.qq.com/pay/unifiedorder';
                  
                  $parameters=array(
                      'appid'=>$this->config["appid"],//appID
                      'mch_id'=>$this->config['mch_id'],//商戶號
                      'openid'=>$businessInfo['openid'],//用戶openid
                      'nonce_str'=>$wechatpay->getRandString(30),//隨機字符串
                      'body'=>'購買商品',//商品描述
                      'out_trade_no'=>$code,//商戶訂單號
                      'total_fee'=>$price*100,//總金額 單位 分 
                      // 'total_fee'=>1,//總金額 單位 分 
                      'spbill_create_ip'=>$this->get_client_ip(),//終端IP
                      'notify_url'=>$this->config["notify_url"],//通知地址
                      'trade_type'=>'JSAPI',//交易類型
                      'sign_type'=>"MD5",
                      'attach'=>$attach
                  );
                  //參數名ASCII碼從小到大排序
                  ksort($parameters);
                  //統一下單簽名
                  $String = $wechatpay->ToUrlParams($parameters);
                  //簽名步驟二:在string后加入KEY
                  $String = $String."&key=".$this->config['api_key']; // key設置路徑:微信商戶平臺(pay.weixin.qq.com)-->賬戶設置-->API安全-->密鑰設置
                  //簽名步驟三:MD5加密 (一次簽名)
                  $time=time();
                  $parameters['sign']=strtoupper(md5($String));
                  $xmlData=$wechatpay->arrayToXml($parameters);
                  $return=$wechatpay->xmlToArray($wechatpay->curl_https($url,$xmlData));
                  if($return["return_code"]=="SUCCESS" && $return["result_code"]=="SUCCESS"){
                      // 從預支付接口返回的參數中取得 prepay_id
                      $prepay_id = $return['prepay_id'];
                      // 構造二次簽名的參數
                      $signParams = array(
                          'appId' => $this->config["appid"],
                          'timeStamp' => (string)$time, // 時間戳需與統一下單時的時間戳保持一致
                          'nonceStr' => $wechatpay->getRandString(30), // 隨機字符串
                          'package' => 'prepay_id=' . $prepay_id, // 統一下單接口返回的 prepay_id
                          'signType' => 'MD5'
                      );
                      // 將參數按照參數名 ASCII 碼從小到大排序
                      ksort($signParams);
                      // 拼接成字符串
                      $signString = $wechatpay->ToUrlParams($signParams);
                      // 在字符串末尾加上商戶密鑰
                      $signString = $signString . "&key=" . $this->config['api_key'];
                      // 對簽名字符串進行 MD5 加密并轉大寫 (二次簽名)
                      $sign = strtoupper(md5($signString));
                      // 將簽名加入返回給小程序的參數中
                      $signParams['paySign'] = $sign;
                      // 返回二次簽名后的參數給小程序端
                      $this->result($signParams,'1','二次簽名成功!','json');
                  }else{
                      echo json_encode(array("status"=>false,"msg"=>$return));
                  }
          }
      
      /*
          獲取當前服務器的IP
      */
          public 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;
          }
      
      
      1. 支付回調
      //微信支付回調接口
      public function wxpaynotify(){
              $xml = file_get_contents('php://input');
              Loader::import('wechatpay.Wechatpay', EXTEND_PATH,".php");
              $wechatpay = new \Wechatpay();
      
              //將服務器返回的XML數據轉化為數組
              $data = $wechatpay->xmlToArray($xml);
              // 保存微信服務器返回的簽名sign
              $data_sign = $data['sign'];
              // sign不參與簽名算法
              unset($data['sign']);
              $sign = $wechatpay->ToUrlParams($data);
              $payData=$sign;
              $sign=strtoupper(md5($sign."&key=".$this->config["api_key"]));
              // 判斷簽名是否正確  判斷支付狀態
              if ( ($sign===$data_sign) && ($data['result_code']=='SUCCESS') ) {
                  //支付成功
                  //其他操作
                  $result = true;
              }else{
                  $result = false;
              }
              // 返回狀態給微信服務器
              if ($result) {
                  $str='<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>';
              }else{
                  $str='<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[簽名失敗]]></return_msg></xml>';
              }
              echo $str;
      
          }
      

      流程實現(前端)(uniApp)

      // 調用 wx.requestPayment 方法發起支付請求
      wx.requestPayment({
      	appId: response.appid,
      	timeStamp: String(response.timeStamp),
      	nonceStr: response.nonceStr,
      	package: response.package,
      	signType: response.signType,
      	paySign: response.paySign,
      	success(res) {
      		// 支付成功的處理邏輯
      		console.log('支付成功', res);
      		uni.showToast({
      			title: '支付成功!',
      			icon: 'none',
      			duration: 1000
      		})
      	},
      	fail(res) {
      		// 支付失敗的處理邏輯
      		console.log('支付失敗', res);
      		uni.showToast({
      			title: '已取消支付',
      			icon: 'none',
      			duration: 2000
      		})
      	}
      });
      
      posted @ 2024-06-27 17:43  我恨bug  閱讀(328)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 亚洲国产成人精品福利无码| 4hu亚洲人成人无码网www电影首页 | 国产对白熟女受不了了| 当雄县| 精品人人妻人人澡人人爽人人 | 罗甸县| 亚洲真人无码永久在线| 在国产线视频A在线视频| 色综合久久一区二区三区| 丝袜欧美视频首页在线| 国产性一交一乱一伦一色一情| 午夜福利yw在线观看2020| 激情综合网激情五月我去也| 中文字幕亚洲精品人妻| 亚洲国产成人久久77| 国产精品中文第一字幕| 在线欧美精品一区二区三区| 国产欧美日韩va另类在线播放| 一本色道久久—综合亚洲| 国产成人精品国产成人亚洲| 久久av色欲av久久蜜桃网| 成人国产精品中文字幕| 久久久无码精品亚洲日韩蜜臀浪潮 | 无码一区二区三区久久精品| 国产精品亚洲二区在线播放| 亚洲偷偷自拍码高清视频| 婷婷伊人久久| 久久精品国产蜜臀av| 国产蜜臀一区二区在线播放 | 国产精品日韩av一区二区| 精品无码人妻一区二区三区| 99re6这里有精品热视频| 察雅县| 欧美老少配性行为| 韩城市| 国产精品久久无中文字幕| 国产成人综合在线女婷五月99播放| 灵石县| 乱色欧美激惰| 日韩在线视频线观看一区| 影音先锋大黄瓜视频|