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

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

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

      uniapp+thinkphp5實(shí)現(xiàn)微信掃碼支付(APP支付)

      前言

      統(tǒng)一支付是JSAPI/NATIVE/APP各種支付場(chǎng)景下生成支付訂單,返回預(yù)支付訂單號(hào)的接口,目前微信支付所有場(chǎng)景均使用這一接口。下面介紹的是其中APP的支付的配置與實(shí)現(xiàn)流程

      配置

      1.首先登錄微信開放平臺(tái),注冊(cè)賬號(hào)。
      https://open.weixin.qq.com/
      2.點(diǎn)擊創(chuàng)建移動(dòng)應(yīng)用

      3.獲取到移動(dòng)應(yīng)用的APPID

      4.打開前端uniapp的項(xiàng)目,在主目錄下找到manifest.json文件->APP模塊配置->Payment->微信支付->將微信開放平臺(tái)的應(yīng)用APPID填寫在對(duì)應(yīng)的位置

      5.根據(jù)微信開放平臺(tái)提供的工具對(duì)項(xiàng)目包的包名進(jìn)行簽名的獲取



      下載鏈接:https://developers.weixin.qq.com/doc/oplatform/Downloads/Android_Resource.html#%E7%AD%BE%E5%90%8D%E7%94%9F%E6%88%90%E5%B7%A5%E5%85%B7
      安裝完畢是這樣的:輸入您的應(yīng)用包名進(jìn)行簽名的獲取即可

      6.申請(qǐng)開通微信支付


      微信商戶號(hào)綁定APPID

      選擇我的產(chǎn)品,申請(qǐng)開通APP、JSAPI支付

      選擇賬戶中心->api安全,進(jìn)行證書與密鑰的申請(qǐng),v2/v3都可以申請(qǐng),調(diào)用的api不同,并不沖突

      到此為止關(guān)于app微信支付的配置就基本完成了。

      流程實(shí)現(xiàn)(后端)(PHP)

      1. 創(chuàng)建Wechatpay.php文件,放到指定文件目錄下(我是放到了extend目錄)
      <?php
      
        class Wechatpay{
      
      
            /**
             * 模擬提交參數(shù),支持https提交 可用于各類api請(qǐng)求
             * @param string $url : 提交的地址
             * @param array $data :POST數(shù)組
             * @param string $method : POST/GET,默認(rèn)GET方式
             * @return mixed
             */
            function curl_https($url, $xml='', $useCert=false){
      
                $ch = curl_init();
                //設(shè)置超時(shí)
                curl_setopt($ch, CURLOPT_TIMEOUT, 30);
                curl_setopt($ch,CURLOPT_URL, $url);
      
                //設(shè)置header
                curl_setopt($ch, CURLOPT_HEADER, FALSE);
                //要求結(jié)果為字符串且輸出到屏幕上
                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);//嚴(yán)格校驗(yàn)
                }
                if($useCert == true){
                    //設(shè)置證書
                    //使用證書:cert 與 key 分別屬于兩個(gè).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);
                //運(yùn)行curl
                $data = curl_exec($ch);
                //返回結(jié)果
                if($data){
                    curl_close($ch);
                    return $data;
                } else {
                    $error = curl_errno($ch);
                    curl_close($ch);
                    //echo $error;
                }
      
            }
      
            /**
             *
             * 拼接簽名字符串
             * @param array $urlObj
             *
             * @return 返回已經(jīng)拼接好的字符串
             */
            function ToUrlParams($urlObj)
            {
                $buff = "";
                foreach ($urlObj as $k => $v)
                {
                    if($k != "sign"){
                        $buff .= $k . "=" . $v . "&";
                    }
                }
      
                $buff = trim($buff, "&");
                return $buff;
            }
      
      
            //數(shù)組轉(zhuǎn)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轉(zhuǎn)為array
            function xmlToArray($xml)
            {
                //禁止引用外部xml實(shí)體
                libxml_disable_entity_loader(true);
                $values = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
                return $values;
            }
      
            /**
             * 獲取隨機(jī)字符串
             * @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_app' => "wx******",    /*微信開放平臺(tái)上的應(yīng)用id*/
              'mch_id' => "*******",   /*微信申請(qǐng)成功之后郵件中的商戶id*/
              'api_key' => "*************",    /*在微信商戶平臺(tái)上自己設(shè)定的api密鑰 32位*/
              'notify_url' => 'https://***',  /*支付回調(diào)地址,確保可以訪問*/
          );
      

      3.支付接口

      public function AppPay($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_app"], // 應(yīng)用ID
                      'mch_id' => $this->config['mch_id'], // 商戶號(hào)
                      'nonce_str' => $wechatpay->getRandString(30), // 隨機(jī)字符串
                      'body' => '購買商品測(cè)試', // 商品描述
                      'out_trade_no' => $code, // 商戶訂單號(hào)
                      'total_fee' => $price * 100, // 總金額,單位為分
                      'spbill_create_ip' => $this->get_client_ip(), // 終端IP
                      'notify_url' => $this->config["notify_url"], // 通知地址
                      'trade_type' => "APP", // 交易類型改為APP
                      'sign_type' => "MD5",
                      'attach' => $attach
                  );
      
                  //參數(shù)名ASCII碼從小到大排序
                  ksort($parameters);
                  //統(tǒng)一下單簽名
                  $String = $wechatpay->ToUrlParams($parameters);
                  
                  //簽名步驟二:在string后加入KEY
                  $String = $String."&key=".$this->config['api_key']; // key設(shè)置路徑:微信商戶平臺(tái)(pay.weixin.qq.com)-->賬戶設(shè)置-->API安全-->密鑰設(shè)置
                  $String2=$String;
                  //簽名步驟三: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"){
                      // 從預(yù)支付接口返回的參數(shù)中取得 prepay_id
                      $prepay_id = $return['prepay_id'];
                      // 構(gòu)造二次簽名的參數(shù)
                      $signParams = array(
                          'appid' => $this->config["appid_app"],
                          'partnerid' => $this->config['mch_id'], // 商戶號(hào)
                          'prepayid' => $return['prepay_id'], // 從預(yù)支付接口返回的參數(shù)中取得prepay_id
                          'package' => 'Sign=WXPay', // Sign=WXPay
                          'noncestr' => $wechatpay->getRandString(30), // 隨機(jī)字符串
                          'timestamp' => (string)$time, // 時(shí)間戳需與統(tǒng)一下單時(shí)的時(shí)間戳保持一致
                      );
                      
                      // 對(duì)簽名參數(shù)進(jìn)行簽名
                      ksort($signParams);
                      $signString = $wechatpay->ToUrlParams($signParams);
                      $signString = $signString . "&key=" . $this->config['api_key'];
                      $sign = strtoupper(md5($signString));
                      
                      // 將簽名加入返回給APP的參數(shù)中
                      $signParams['sign'] = $sign;
                      
                      // 返回參數(shù)給APP
                      $this->result($signParams, '1', '二次簽名成功!', 'json');
                  }else{
                      echo json_encode(array("status"=>false,"msg"=>$return));
                      $this->result($return, '0', '簽名失?。?, 'json');
                  }
          }
          
          
          /*
          獲取當(dāng)前服務(wù)器的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. 支付回調(diào)
      //微信支付回調(diào)接口
          public function wxpaynotify(){
              $xml = file_get_contents('php://input');
              Loader::import('wechatpay.Wechatpay', EXTEND_PATH,".php");
              $wechatpay = new \Wechatpay();
              //將服務(wù)器返回的XML數(shù)據(jù)轉(zhuǎn)化為數(shù)組
              $data = $wechatpay->xmlToArray($xml);
              // 保存微信服務(wù)器返回的簽名sign
              $data_sign = $data['sign'];
              // sign不參與簽名算法
              unset($data['sign']);
              $sign = $wechatpay->ToUrlParams($data);
              $payData=$sign;
              $sign=strtoupper(md5($sign."&key=".$this->config["api_key"]));
              // 判斷簽名是否正確  判斷支付狀態(tài)
              if ( ($sign===$data_sign) && ($data['result_code']=='SUCCESS') ) {
                  
                  // 更新消費(fèi)訂單狀態(tài)等操作
                  
                  $result = true;
              }else{
                  file_put_contents('payResult.tex','驗(yàn)簽失敗!');
                  $result = false;
              }
              // 返回狀態(tài)給微信服務(wù)器
              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;
      
          }
      

      流程實(shí)現(xiàn)(前端)(Vue)(APP)

      uni.getProvider({
      	service: 'payment',
      	success: function(ress) {
              //判斷是否有支付權(quán)限
      		if (~ress.provider.indexOf('wxpay')) {
      			let orderInfo={
      				"appid": result.data.appid, // 微信開放平臺(tái) - 應(yīng)用 - AppId,注意和微信小程序、公眾號(hào) AppId 可能不一致
      				"noncestr": result.data.noncestr, // 隨機(jī)字符串
      				"package": "Sign=WXPay", // 固定值
      				"partnerid": result.data.partnerid, // 微信支付商戶號(hào)
      				"prepayid": result.data.prepayid, // 統(tǒng)一下單訂單號(hào) 
      				"timestamp": result.data.timestamp, // 時(shí)間戳(單位:秒)
      				"sign": result.data.sign // 簽名,這里用的 MD5/RSA 簽名
      			}
      			// 調(diào)用 wx.requestPayment 方法發(fā)起支付請(qǐng)求
      			uni.requestPayment({
      				"provider": "wxpay",
      				"orderInfo": orderInfo,
      				success(res) {
      					// 支付成功的處理邏輯
      					console.log('支付成功', res);
      					uni.showToast({
      						title: '支付成功!',
      						icon: 'none',
      						duration: 1000
      					})
      				},
      				fail(res) {
      					// 支付失敗的處理邏輯
      					console.log('支付失敗', res);
      					uni.showToast({
      						title: res.errMsg,
      						icon: 'none',
      						duration: 2000
      					})
      				  }
      			})
      
      		 }
      	}
      });
      
      posted @ 2024-06-29 14:14  我恨bug  閱讀(272)  評(píng)論(0)    收藏  舉報(bào)
      主站蜘蛛池模板: 国产亚洲欧美精品久久久| 亚洲精品一区二区妖精| 亚洲国产精品一区二区第一页| 亚洲精品无码成人A片九色播放| 高清中文字幕国产精品| 动漫av网站免费观看| 国产成人综合欧美精品久久| 亚日韩精品一区二区三区| 国产性三级高清在线观看| 色国产视频| 九九热视频在线免费观看| 高清有码国产一区二区| 国产又色又爽又黄的| 国产精品自拍午夜福利| 名山县| 成人午夜免费无码视频在线观看| 国产精品九九九一区二区| 亚洲av无码成人影院一区| 国产精品亚洲二区在线播放| 亚洲男人电影天堂无码| 亚洲成a人在线播放www| 99久热在线精品视频| 伊人色综合一区二区三区| 久久天天躁狠狠躁夜夜躁2o2o| 巨熟乳波霸若妻在线播放| 久久精品国产99精品亚洲| 国产精品va无码一区二区| 久久天天躁狠狠躁夜夜躁| 在国产线视频A在线视频| 久久精品国产亚洲夜色av网站| 色欲av亚洲一区无码少妇| 国产精品中文字幕久久| 库尔勒市| 非会员区试看120秒6次| 国产特级毛片aaaaaa高清| 免费无码又爽又刺激高潮虎虎视频| 亚洲一区三区三区成人久| 国产亚洲av夜间福利香蕉149| 亚洲欧美日韩在线不卡| 亚洲精品国产一二三区| 日韩人妻无码一区二区三区久久|