ThinkPHP 구현 위 챗 결제(jsapi 결제)프로 세 스 튜 토리 얼 상세 설명

전에 한 편의 글 을 써 서PHP 위 챗 결제(jsapi 결제)프로 세 스 구현이 야 기 를 했 는데 상세 한 것 은 글 을 보십시오.PHP 위 챗 결제(jsapi 결제)프로 세 스 구현
당시 환경 은 프레임 워 크 를 사용 하지 않 고 도 메 인 이름 이 가리 키 는 디 렉 터 리 아래 에 새 디 렉 터 리 를 직접 방문 한 후 이 디 렉 터 리 에 접근 하여 이 루어 졌 으 나 프레임 워 크 에 적용 하 는 데 문제 가 있 었 습 니 다.ThinkPHP 에 서 는 경로 규칙 과 지불 권한 수여 디 렉 터 리 가 다 르 기 때문에 오류 가 발생 할 수 있 습 니 다.이 편 은 TP 에 위 챗 결 제 를 통합 하 는 절 차 를 말한다.
거위 공장 에서 나 온 SDK 와 문 서 는 바로 네가 알 아 볼 수 없 게 힘껏 감 는 것 이다.이 시큼 하고 시원 하 게 사용 하면 알 수 있다.문서 와 SDK 는 간단 하고 알 기 쉬 울 수록 좋 지 않 습 니까?설마 힘껏 재 구성 해야만 거위 공장 프로그램 원숭이 기술 의 뛰어난 점 을 나 타 낼 수 있 단 말 인가?음...내 풋내기 의 속성 을 드 러 낸 거 아니 야?
공식 적 으로 돌아 가 고 싶 지 않 은 것 에 대해 TP 에서 위 챗 결 제 를 사용 하고 싶 은 사람 은 자신 이 공식 문서 재 구성 에 따라 간소화 하여 만 든 TP 에 적용 되 는 결제 SDK 를 볼 수 있 습 니 다.소스 코드 는 제 가 다운로드 해서 봤 습 니 다.코드 는 우아 한 프로필 을 썼 고 절차 도 간단 하 며 알 기 쉽 습 니 다.상세 한 내용 은 박문:http://baijunyao.com/article/78
저 는 눈 살 을 찌 푸 리 며 공식 SDK 를 사 용 했 고 결제 도 성 공 했 습 니 다.다음은 절 차 를 공유 하 겠 습 니 다.
1.SDK 다운로드 및 수정
이것 은 더 이상 말 할 수 없습니다.모 르 는 것 은 제 지난 글 을 볼 수 있 습 니 다.PHP 위 챗 결제(jsapi 결제)프로 세 스 구현안에 다운로드 한 파일 중 어떤 것 이 수정 해 야 하 는 지 상세 하 게 설명 되 어 있 습 니 다.
2.공중 번호 설정
A.웹 페이지 권한 수여 도 메 인 이름 을 설정 해 야 합 니 다.이것 은 특별한 것 이 없습니다.
B.여기 서 결제 권한 수여 디 렉 터 리 를 주의해 야 합 니 다.TP 를 사용 할 때 많은 사람들 이 재 작성 모드(REWRITE 모드)를 사용 하거나 REWRITE 모드 를 사용 하 는 동시에 위 정적 모드 를 사용 합 니 다.이때 생 성 된 링크 는 다음 과 같 습 니 다.  http://serverName/Home/Blog/read/id/1
만약 에 PATHINFO 모드 를 사용한다 면 생 성 된 링크 는 다음 과 같 습 니 다.http://serverName/index.php/Home/Blog/read/id/1예 를 들 어 Home 모듈 에 있 는 Blog 컨트롤 러 의 한 방법 으로 지불 합 니 다.저희 가 지불 한 권한 수여 디 렉 터 리 는http://serverName/Home/Blog/또는http://serverName/index.php/Home/Blog/이 어야 합 니 다.이것 은 자신의 TP 가 설정 한 URL 모드 에 따라 정 해 져 있 습 니 다.
3.지불 절차
(1)통일 주문
아래 의 결제 매개 변수 설정 은 앞에서 말 한 것 과 대체적으로 변 하지 않 습 니 다.중요 한 것 은 결제 리 셋 검증 링크 입 니 다.여러 번 호출 해 야 하기 때문에 저 는 application/Common/common/function.php 에서 매개 변수 설정 을 봉 했 습 니 다.제 SDK 는 프로젝트 루트 에 기 록 된 Api 디 렉 터 리 에 두 었 기 때문에 SDK 를 도입 할 때 Vendor 함 수 를 사용 하지 않 습 니 다.

/** 
 *      
 * @param string $openId  openid 
 * @param string $goods       
 * @param string $attach      ,            ,    ID 
 * @param string $order_sn     
 * @param string $total_fee    
 */ 
function wxpay($openId,$goods,$order_sn,$total_fee,$attach){ 
 require_once APP_ROOT."/Api/wxpay/lib/WxPay.Api.php"; 
 require_once APP_ROOT."/Api/wxpay/payment/WxPay.JsApiPay.php"; 
 require_once APP_ROOT.'/Api/wxpay/payment/log.php'; 
 //      
 $logHandler= new CLogFileHandler(APP_ROOT."/Api/wxpay/logs/".date('Y-m-d').'.log'); 
 $log = Log::Init($logHandler, 15); 
 $tools = new JsApiPay(); 
 if(empty($openId)) $openId = $tools->GetOpenid(); 
 $input = new WxPayUnifiedOrder(); 
 $input->SetBody($goods);     //     
 $input->SetAttach($attach);     //    ,     ,    ,            
 $input->SetOut_trade_no($order_sn);   //    
 $input->SetTotal_fee($total_fee);   //    ,  :  
 $input->SetTime_start(date("YmdHis"));  //       
 $input->SetTime_expire(date("YmdHis", time() + 600));//     
 $input->SetGoods_tag("test3"); 
 //$input->SetNotify_url("http://".$_SERVER['HTTP_HOST']."/payment.php"); //         
 $input->SetNotify_url("http://".$_SERVER['HTTP_HOST']."/payment.php/WexinApi/WeixinPay/notify"); 
 $input->SetTrade_type("JSAPI");    //     
 $input->SetOpenid($openId);     //  openID 
 $order = WxPayApi::unifiedOrder($input); //     
 $jsApiParameters = $tools->GetJsApiParameters($order); 
 return $jsApiParameters; 
} 
주의 하 세 요.주의 하 세 요.칠판 을 두 드 려 서 요점 을 그 었 습 니 다.
리 셋 인증 링크 를 지불 하려 면 인증 할 수 있 는 권한 이 없어 야 합 니 다.만약 에 자신 이 그 링크 를 방문 하고 로그 인 인증 이 필요 하 다 면 시도 하지 마 십시오.무장 애 로 접근 할 수 있 는 링크 가 있어 야 합 니 다.그리고 일련의 매개 변수 전달 도 있어 서 는 안 됩 니 다.
가장 좋 은 것 은 간단 하고 거 친http://serverName/xxx.php입 니 다.저 는 디 렉 터 리 아래 index.php 와 유사 하 게 리 셋 을 위 한 입구 파일 payment.php 를 다시 썼 습 니 다.이에 대응 하 는 application/디 렉 터 리 의 모듈(WexinApi),컨트롤 러(WeixinPay)와 방법(notify):

//   PHP   
if(version_compare(PHP_VERSION,'5.3.0','<')) die('require PHP > 5.3.0 !'); 
// $_GET['m']='Admin'; 
//                           false 
define('APP_DEBUG',True); 
//           
$_GET['m']='WexinApi'; 
$_GET['c']='WeixinPay'; 
$_GET['a']='notify'; 
//        
define('APP_PATH','./Application/'); 
define("APP_ROOT",dirname(__FILE__)); 
//   ThinkPHP     
require './ThinkCore/ThinkCore.php'; 
//  ^_^                   
지금 방문http://serverName/payment.php하면 바로 들 어 갑 니 다.  http://serverName/payment.php/WexinApi/WeixinPay/notify  ,이렇게 리 셋 인증 링크 를 쓸 수 있 습 니 다.  http://serverName/payment.php,쓸 수도 있 습 니 다http://serverName/payment.php/WexinApi/WeixinPay/notify.
(2)지급 개시
여전히 간단 하 다.

/** 
*      
*     :http://daoshi.sdxiaochengxu.com/payment.php/WexinApi/WeixinPay/pay 
*/ 
public function pay(){ 
 $order_sn = getrand_num(true); 
 $openId = ''; 
 $jsApiParameters = wxpay($openId,'    ',$order_sn,1); 
 $this->assign(array( 
  'data' => $jsApiParameters 
 )); 
 $this->display(); 
} 

<html> 
<head> 
 <meta http-equiv="content-type" content="text/html;charset=utf-8"/> 
 <meta name="viewport" content="width=device-width, initial-scale=1"/> 
 <title>      </title> 
 <script type="text/javascript"> 
 //    JS api    
 function jsApiCall() 
 { 
  var data={$data}; 
  WeixinJSBridge.invoke( 
   'getBrandWCPayRequest', data, 
   function(res){ 
    WeixinJSBridge.log(res.err_msg); 
    //alert('err_code:'+res.err_code+'err_desc:'+res.err_desc+'err_msg:'+res.err_msg); 
    //alert(res.err_code+res.err_desc+res.err_msg); 
    //alert(res); 
    if(res.err_msg == "get_brand_wcpay_request:ok"){ 
     alert("    !"); 
     window.location.href="http://m.blog.csdn.net/article/details?id=72765676" rel="external nofollow" ; 
    }else if(res.err_msg == "get_brand_wcpay_request:cancel"){ 
     alert("      !"); 
    }else{ 
     alert("    !"); 
    } 
   } 
  ); 
 } 
 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/> 
 <font color="#9ACD32"><b>         <span style="color:#f00;font-size:50px">1 </span> </b></font><br/><br/> 
 <font color="#9ACD32"><b><span style="color:#f00;font-size:50px;margin-left:40%;">1 </span>    </b></font><br/><br/> 
 <div align="center"> 
  <button style="width:210px; height:50px; border-radius: 15px;background-color:#FE6714; border:0px #FE6714 solid; cursor: pointer; color:white; font-size:16px;" type="button" onclick="callpay()" >     ^_^</button> 
 </div> 
</body> 
</html> 
그러나 결제 페이지 의 URL 은 주의해 야 합 니 다.결제 페이지 의 URL 은 많은 인 자 를 가지 고 있 을 것 입 니 다.방금 TP 에서 사용 하 는 REWRITE 모드 라 고 말 했 는데 링크 는 비슷 합 니 다[  http://serverName/Home/Blog/read/id/1]이런 것 은 더 많은 인 자 를 가 질 수 있 습 니 다.이때 위 챗 결 제 는 귀하 의 지불 권한 수여 목록 이[  http://serverName/Home/Blog/read/id/  ],하지만 당신 의 실제 권한 수여 목록 은[  http://serverName/Home/Blog/]그래서 잘못 보고 합 니 다.처리 방법 은 결제 페이지 에 들 어 갈 때 URL 을 재 구성 하여 일반 모드 로 쓰 는 것 이다.즉,[  http://serverName/Home/Blog/read?id=1]이렇게 하면 됩 니 다.

(3)성공 리 셋 지원
현재 결제 가 완료 되면 이전에 작성 한 링크 에 대응 하 는 방법,즉[  http://serverName/payment.php/WexinApi/WeixinPay/notify ]:

//         
public function notify(){ 
 $xml = $GLOBALS['HTTP_RAW_POST_DATA']; 
 //   file_put_contents           XML            
 file_put_contents('./Api/wxpay/logs/log.txt',$xml,FILE_APPEND); 
 //       XML        
 //$data = json_decode(json_encode(simplexml_load_string($xml,'SimpleXMLElement',LIBXML_NOCDATA)),true); 
 $data = xmlToArray($xml); 
 //             sign 
 $data_sign = $data['sign']; 
 // sign        
 unset($data['sign']); 
 $sign = $this->makeSign($data); 
 //                 
 if ( ($sign===$data_sign) && ($data['return_code']=='SUCCESS') && ($data['result_code']=='SUCCESS') ) { 
  $result = $data; 
  //   file_put_contents           XML            
  file_put_contents('./Api/wxpay/logs/log1.txt',$xml,FILE_APPEND); 
  //           
  $order_sn = $data['out_trade_no']; //     
  $order_id = $data['attach'];  //    ,      ID 
  $openid = $data['openid'];   //   openID 
  $total_fee = $data['total_fee']; //     
  //      
  $this->updateDB($order_id,$order_sn,$openid,$total_fee); 
 }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; 
 return $result; 
} 
안전 을 위해 되 돌아 온 서명 을 다시 검증 해 야 합 니 다.

/** 
*      
* @return   ,      sign     
*/ 
protected function makeSign($data){ 
 //         
 require_once APP_ROOT."/Api/wxpay/lib/WxPay.Api.php"; 
 $key = \WxPayConfig::KEY; 
 //    
 $data=array_filter($data); 
 //     :         
 ksort($data); 
 $string_a=http_build_query($data); 
 $string_a=urldecode($string_a); 
 //     : string   KEY 
 //$config=$this->config; 
 $string_sign_temp=$string_a."&key=".$key; 
 //     :MD5   
 $sign = md5($string_sign_temp); 
 //      :         
 $result=strtoupper($sign); 
 return $result; 
} 
이로써 TP 에서 위 챗 결제 도 완료 됐다.이것 은 공식 SDK 를 통합 하여 실현 한 것 으로 SDK 를 사용 하지 않 으 면 더욱 간단 한 방법 을 사용 할 수 있다.PHP 는 위 챗 결제(jsapi 결제)와 환불(통합 결제 SDK 필요 없 음)을 실현 합 니 다.

총결산
위 에서 말씀 드 린 것 은 편집장 님 께 서 소개 해 주신 ThinkpHP 가 위 챗 결제(jsapi 결제)절차 에 대한 상세 한 설명 입 니 다.여러분 께 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 메 시 지 를 남 겨 주세요.편집장 님 께 서 신속하게 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기