ThinkPHP 프레임 워 크 통합 위 챗 결제 의 JSPI 모드 그림 설명

이 사례 는 ThinkPHP 프레임 워 크 가 위 챗 결제 의 JSPI 모델 을 통합 하 는 것 을 보 여 준다.여러분 께 참고 하도록 공유 하 겠 습 니 다.구체 적 으로 는 다음 과 같 습 니 다.
현재 위 챗 은 매우 핫 하 다.위 챗 결 제 는 현재 인터넷 에서 일련의 상세 한 demo 를 볼 수 없 기 때문에 위 챗 결제 시리즈 에 관 한 강 좌 를 하 는 데 시간 이 좀 걸린다.
이번 튜 토리 얼 은 JSPI 모드 결제 이 며,나머지 는 계속 쓰 겠 습 니 다.
우선,위 챗 결 제 를 다운로드 한 demo 는 위 챗 의 demo 에 따라 TP 에 통합 합 니 다.
우리 가 여기에 필요 로 하 는 몇 가지 파일 을 소개 합 니 다.

demo 폴 더 에서:
js_api_call.php:위 챗 jsapi 의 주요 기능 을 제공 합 니 다.
log_.php:인쇄 로그 기능 제공
notify_url.php:비동기 알림 기능
notify_url.log:비동기 알림 로그
qrcode.js:QR 코드 js 플러그 인 생 성
다음은 WxPayPubHelper 폴 더 의 파일 을 소개 합 니 다.

cacert 폴 더 는 위 챗 인증 서 를 저장 합 니 다(PS:구체 적 으로 저 는 인증 서 를 별로 사용 하지 않 았 습 니 다.다운로드 되 었 지만 인증 서 는 위 챗 상점 플랫폼 에서 다운로드 하 십시오)
SDKRuntimeException.php:이것 이 이상 처리 입 니 다.
WxPay.pub.config.php:이것 은 설정 을 한 것 입 니 다.잠시 후에 자세히 설명 하 겠 습 니 다.
WxPayPub Helper.php:이것 은 사실 위 챗 결제 도구 류 입 니 다.초보 자 에 게 는 그 안에 있 는 방법 만 알 면 됩 니 다.
OK,위 챗 이 공식 적 으로 제공 한 서 류 를 알 게 되면 우 리 는 TP 에 통합 할 수 있 습 니 다.쓸데없는 말 을 하지 않 고 시작 합 니 다!
step 1:demo 의 WxPayPubHelper 폴 더 전 체 를 TP 의 Vendor 디 렉 터 리 에 복사 합 니 다.저 처럼:

step 2:WxPay.pub.config.php 파일 설정:

여기 설정 에 주석 이 있 습 니 다.모 르 거나 설정 에 문제 가 있 으 면 질문 을 남 길 수 있 습 니 다.
동시에 저 는 위 챗 의 이 설정 을 TP config 에 넣 었 습 니 다.이 단 계 는 여러분 이 마음대로 하 셔 도 됩 니 다.

<?php
return array(
 //'   '=>'   '
 define('WEB_HOST', '          '),
 /*      */
 'WxPayConf_pub'=>array(
  'APPID' => '  APPID',
  'MCHID' => '    ID',
  'KEY' => '    ',
  'APPSECRET' => '  APPSECRET',
  'JS_API_CALL_URL' => WEB_HOST.'/index.php/Home/WxJsAPI/jsApiCall',
  'SSLCERT_PATH' => WEB_HOST.'/ThinkPHP/Library/Vendor/WxPayPubHelper/cacert/apiclient_cert.pem',
  'SSLKEY_PATH' => WEB_HOST.'/ThinkPHP/Library/Vendor/WxPayPubHelper/cacert/apiclient_key.pem',
  'NOTIFY_URL' => WEB_HOST.'/index.php/Home/WxJsAPI/notify',
  'CURL_TIMEOUT' => 30
 )
);
step 3:QR 코드 를 생 성 하 는 js 를 Public 디 렉 터 리 에 놓 습 니 다.

step 4:컨트롤 러 만 들 기:여기 WxJSAPIController 컨트롤 러 를 만 들 었 습 니 다.여기 서 여러분 이 마음대로 이름 을 짓 고 이것 이 공공 플랫폼 에서 의 설정 과 대응 하면 됩 니 다.(공공 플랫폼 설정 은 잠시 후에 소개 합 니 다)

다음은 컨트롤 러 의 코드 부분 입 니 다.먼저 컨트롤 러 를 초기 화하 고 WxPayPubHelper 를 가 져 옵 니 다.

/**
  *    
  */
 public function _initialize()
 {
  //  WxPayPubHelper
  vendor('WxPayPubHelper.WxPayPubHelper');
 }
다음은 통일 결제 인 터 페 이 스 를 사용 하여 prepay 획득id 방법:

 public function jsApiCall()
 {
  //  jsapi  
  $jsApi = new \JsApi_pub();
  
  //=========  1:        openid============
  //  code  openid
  if (!isset($_GET['code']))
  {
   //      code 
   $url = $jsApi->createOauthUrlForCode(C('WxPayConf_pub.JS_API_CALL_URL'));
   Header("Location: $url");
  }else
  {
   //  code ,   openid
   $code = $_GET['code'];
   $jsApi->setCode($code);
   $openid = $jsApi->getOpenId();
  }
  
  //=========  2:        ,  prepay_id============
  //        
  $unifiedOrder = new \UnifiedOrder_pub();
  
  //          
  //      
  //appid  ,        
  //mch_id  ,        
  //noncestr  ,        
  //spbill_create_ip  ,        
  //sign  ,        
  $unifiedOrder->setParameter("openid",$openid);//    
  $unifiedOrder->setParameter("body","     ");//    
  //      ,      
  $timeStamp = time();
  $out_trade_no = C('WxPayConf_pub.APPID').$timeStamp;
  $unifiedOrder->setParameter("out_trade_no",$out_trade_no);//     
  $unifiedOrder->setParameter("total_fee","1");//   
  $unifiedOrder->setParameter("notify_url",C('WxPayConf_pub.NOTIFY_URL'));//    
  $unifiedOrder->setParameter("trade_type","JSAPI");//    
  //     ,           
  //$unifiedOrder->setParameter("sub_mch_id","XXXX");//    
  //$unifiedOrder->setParameter("device_info","XXXX");//   
  //$unifiedOrder->setParameter("attach","XXXX");//    
  //$unifiedOrder->setParameter("time_start","XXXX");//      
  //$unifiedOrder->setParameter("time_expire","XXXX");//      
  //$unifiedOrder->setParameter("goods_tag","XXXX");//    
  //$unifiedOrder->setParameter("openid","XXXX");//    
  //$unifiedOrder->setParameter("product_id","XXXX");//  ID
  
  $prepay_id = $unifiedOrder->getPrepayId();
  //=========  3:  jsapi    ============
  $jsApi->setPrepayId($prepay_id);
  
  $jsApiParameters = $jsApi->getParameters();
  
  $this->assign('jsApiParameters',$jsApiParameters);
  $this->display('pay');
  //echo $jsApiParameters;
 }
여 기 는 모두 위 챗 demo 를 복사 하여 이름 을 바 꾸 었 을 뿐 다른 것 은 없습니다.
다음은 비동기 알림 방법 이자 복 제 된 위 챗 데모 에 있 는 것 입 니 다.

 public function notify()
 {
  //        
  $notify = new \Notify_pub();
  
  //       
  $xml = $GLOBALS['HTTP_RAW_POST_DATA'];
  $notify->saveData($xml);
  
  //    ,     。
  //        ,                  ,        ,
  //          ( 30   8 )        ,
  //           ,             。
  if($notify->checkSign() == FALSE){
   $notify->setReturnParameter("return_code","FAIL");//     
   $notify->setReturnParameter("return_msg","    ");//    
  }else{
   $notify->setReturnParameter("return_code","SUCCESS");//     
  }
  $returnXml = $notify->returnXml();
  echo $returnXml;
  
  //==                 ,      =======
  
  // log          
//   $log_ = new Log_();
  $log_name= __ROOT__."/Public/notify_url.log";//log    
  
  log_result($log_name,"【    notify  】:
".$xml."
"); if($notify->checkSign() == TRUE) { if ($notify->data["return_code"] == "FAIL") { // , log_result($log_name,"【 】:
".$xml."
"); } elseif($notify->data["result_code"] == "FAIL"){ // , log_result($log_name,"【 】:
".$xml."
"); } else{ // , log_result($log_name,"【 】:
".$xml."
"); } // , // : // : // : } }
여기 서 나 는 기록 로그 의 종 류 를 function.php 에 썼 다.

function log_result($file,$word)
{
 $fp = fopen($file,"a");
 flock($fp, LOCK_EX) ;
 fwrite($fp,"    :".strftime("%Y-%m-%d-%H:%M:%S",time())."
".$word."

"); flock($fp, LOCK_UN); fclose($fp); }
자,사실 컨트롤 러 의 방법 이 이렇게 많 습 니 다.다른 것 은 없습니다.아래 페이지 를 보고 바로 코드 를 올 리 세 요.

<!DOCTYPE html>
<html>
<head>
 <meta http-equiv="content-type" content="text/html;charset=utf-8"/>
 <title>      </title>

 <script type="text/javascript">

  //    JS api   
  function jsApiCall()
  {
   WeixinJSBridge.invoke(
    'getBrandWCPayRequest',
    <?php echo $jsApiParameters; ?>,
    function(res){
     WeixinJSBridge.log(res.err_msg);
     alert(res.err_code+res.err_desc+res.err_msg);
     //alert("{$jsApiParameters}");
    }
   );
  }

  function callpay()
  {
   if (typeof WeixinJSBridge == "undefined"){
    if( document.addEventListener ){
     document.addEventListener('WeixinJSBridgeReady', jsApiCall, false);
    }else if (document.attachEvent){
     document.attachEvent('WeixinJSBridgeReady', jsApiCall); 
     document.attachEvent('onWeixinJSBridgeReady', jsApiCall);
    }
   }else{
    jsApiCall();
   }
  }
 </script>
</head>
<body>
 </br></br></br></br>
 <div align="center">
  <button style="width:210px; height:30px; background-color:#FE6714; border:0px #FE6714 solid; cursor: pointer; color:white; font-size:16px;" type="button" onclick="callpay()" >    </button>
 </div>
</body>
</html>
아무것도 바 꿀 필요 가 없 이 바로 복사 하면 된다.
다음은 위 챗 공식 플랫폼 의 설정 입 니 다.여기 서 제 가 문제 가 생 긴 적 이 있 습 니 다.여기 서 문제 가 생 긴 친구 가 있 으 면 메 시 지 를 남 겨 주세요.예 를 들 어 accessdeined 또는 accessnotallowed 등의 문 제 는 설정 이 잘못 되 었 기 때 문 일 수 있 습 니 다.
설정 프로 세 스 캡 처 보기:

변경 을 누 르 면 설정 에 들 어 갑 니 다:

자,테스트 할 수 있 습 니 다.다음은 제 테스트 캡 처 입 니 다.
위 챗 으로 QR 코드 를 스캐닝 하 다

위 챗 에서 공헌 을 클릭 하여 결제 페이지 출현:

지금까지 위 챗 JSPI 결제 기능 이 모두 완료 되 었 습 니 다.
물론 당신 이 처음 한다 면 여러 가지 문제 에 부 딪 힐 것 입 니 다.
만약 당신 이 신출내기 라면,겪 은 문제 들 이 왜 그런 지 모 르 겠 지만,
제때에 네가 한 다음 에 해라.나 는 세부 적 인 부주의 로 인해 문제 가 생 길 수 있다 고 믿는다.
그러나 조급해 하지 말고 인내심 을 가지 고 문 제 를 발견 해라.
질문 이 있 으 면 메 시 지 를 남 겨 주세요.다음은 위 챗 스 캔 결제 모델 1,모델 2 의 상세 한 튜 토리 얼 도 소개 합 니 다.
위 챗 결제 튜 토리 얼 스 캔 모드 1:
//www.jb51.net/article/159356.htm
위 챗 결제 튜 토리 얼 스 캔 모드 2:
//www.jb51.net/article/159362.htm
위 챗 결제 튜 토리 얼 카드 결제:
//www.jb51.net/article/159401.htm
thinkpHP 관련 내용 에 관심 이 있 는 독자 들 은 본 사이트 의 주 제 를 볼 수 있다.
본 고 는 ThinkPHP 프레임 워 크 를 기반 으로 한 PHP 프로 그래 밍 에 도움 이 되 기 를 바 랍 니 다.

좋은 웹페이지 즐겨찾기