PHP 구현 위 챗 결제(jsapi 결제)절차 상세 설명

최근 에 한 프로젝트 를 접 했 는데 위 챗 결제 와 관련 되 었 습 니 다.위 챗 개발 을 한 지 이렇게 오래 되 었 지만 결 제 를 하지 못 했 습 니 다.예전 에 도 대중 번호 로 보 너 스 를 보 냈 습 니 다.선배 님 들 의 탐색 에 감 사 드 립 니 다.저 는 그들의 박문 을 보고 많은 시행 착 오 를 덜 걷 게 했 습 니 다.
초기 준비:
1.위 챗 인증 서비스 번호,위 챗 결제 개통
2.위 챗 결제 SDK,다운로드 주소:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1
3.위 챗 결제 플랫폼 에 접속https://pay.weixin.qq.com/index.php/account/api_cert결제 증서 다운로드
방법 단계:
1.demo 파일 처리
(1)공식 demo 를 다운로드 합 니 다.파일 이름 은 WxpayAPI 입 니 다.php_v3,이 파일 을 wxpay 로 이름 을 바 꾸 면 뒤에 디 렉 터 리 를 쓰기 편 합 니 다.
(2)lib 폴 더 의 WxPay.api.php 파일 을 열 고 537 줄 에 curl 네트워크 요청 설정 코드 가 있 습 니 다.

curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,TRUE); 
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,2);//     
다음으로 바 꾸 기:

curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE); 
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,2);//    
cURL 인증 대등한 인증서(peer's certificate)를 금지 하기 위해 서 입 니 다.
(3)lib 폴 더 에 있 는 WxPay.Config.php 파일 을 열 고 25 번 째 줄 부터 자신의 계 정 에 따라 기본 정보 설정 을 완성 합 니 다.

const APPID = '    APPID'; 
const MCHID = '   '; 
const KEY = '      '; 
const APPSECRET = '    secert'; 
(4)lib 폴 더 의 WxPay.Notify.php 파일 을 열 고 79 번 째 줄 의 코드:

if($needSign == true && 
 $this->GetReturn_code($return_code) == "SUCCESS") 
{ 
 $this->SetSign(); 
} 
다음으로 변경:

if($needSign == true && 
 $this->GetReturn_code() == "SUCCESS") 
{ 
 $this->SetSign(); 
} 
(5)cert 인증서 디 렉 터 리 를 열 고 안에 있 는 두 인증 서 를 자신의 결제 인증서 로 바 꿉 니 다.
2.공중 번호 배경 설정
(1)웹 페이지 권한 수여 도 메 인 이름 을 설정 합 니 다.제 도 메 인 이름 은(xy.chuyin.ren)입 니 다.

(1)지불 권한 수여 디 렉 터 리 를 설정 합 니 다.도 메 인 이름 은(xy.chuyin.ren)입 니 다.이 도 메 인 이름 이 가리 키 는 디 렉 터 리 의 weixinopen/폴 더 에 demo 를 두 겠 습 니 다.demo 에서 jsapi.php 파일 은 example/디 렉 터 리 에 있 기 때문에 지불 권한 수여 디 렉 터 리 는 xy.chuyin.ren/weixinopen/wxpay/example/입 니 다.

3.지불 절차
example 디 렉 터 리 에 있 는 jsapi.phop 파일 을 열 고 시작 과 처 리 를 지불 하 는 것 은 모두 여기에서 이 루어 집 니 다.
(1)사용자 openid 가 져 오기
기 존 에 자체 APPID 와 APPESecert 를 설 정 했 기 때문에 여 기 는 처리 할 필요 가 없습니다.

//①、    openid 
$tools = new JsApiPay(); 
$openId = $tools->GetOpenid(); 
여기 서 먼저 초기 화 된 JsApipay()클래스 는 example/디 렉 터 리 에 있 는 WxPay.JsApipay.php 에 대응 하 는 파일 을 대상 으로 받 습 니 다.GetOpenid()방법 을 사용 하면 자신의 openID 를 자동 으로 가 져 옵 니 다.
(2)통일 주문

//②、     
$input = new WxPayUnifiedOrder(); 
$input->SetBody("test"); 
$input->SetAttach("test"); 
$input->SetOut_trade_no(WxPayConfig::MCHID.date("YmdHis")); 
$input->SetTotal_fee("1"); 
$input->SetTime_start(date("YmdHis")); 
$input->SetTime_expire(date("YmdHis", time() + 600)); 
$input->SetGoods_tag("test"); 
$input->SetNotify_url("http://paysdk.weixin.qq.com/example/notify.php"); 
$input->SetTrade_type("JSAPI"); 
$input->SetOpenid($openId); 
$order = WxPayApi::unifiedOrder($input); 
echo '<font color="#f00"><b>         </b></font><br/>'; 
printf_info($order); 
$jsApiParameters = $tools->GetJsApiParameters($order); 
WxPay.api.php 의 24 번 째 줄 에 대응 하 는 유 니 피 드 Order()방법 으로 주문 정보 와 지불 리 셋 함 수 를 설정 합 니 다.여기 서 몇 가지 인 자 를 수정 해 야 합 니 다.
A.상품 명:

$input->SetBody("test"); 
B.주문 번호

$input->SetOut_trade_no(WxPayConfig::MCHID.date("YmdHis")); 
C.지불 금액

$input->SetTotal_fee("1");
D.결제 인증 링크
notify.php 파일 이 있 는 위치 로 설정 되 어 있 습 니 다.그래서 저 는 다음 과 같이 설정 합 니 다http://xy.chuyin.ren/weixinopen/wxpay/example/notify.php
다른 주 소 를 쓸 수도 있 습 니 다.물론 지불 권한 수여 도 메 인 이름 에서 지불 이 성공 하면 이 링크 가 지정 한 방법 으로 자동 으로 되 돌아 가 안에서 판단 과 데이터 베 이 스 를 조작 할 수 있 습 니 다.

$input->SetNotify_url(http://paysdk.weixin.qq.com/example/notify.php);
E.추가 매개 변수

$input->SetAttach("test"); 
추가 매개 변 수 는 채 울 수 있 고 쓰 지 않 을 수 있 으 며,쓰 면 안에 있 는 문자열 에 빈 칸 이 생기 지 않 는 것 이 좋 습 니 다.
이때 결 제 를 클릭 하면 성공 적 으로 지불 할 수 있 을 것 이다.
(3)지급 개시

<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); 
  } 
 ); 
} 
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> 
즉시 결제 단 추 를 누 르 면 콜 페 이()함수 가 호출 됩 니 다.jsApiCal()함 수 를 호출 하여 결제 프로그램 을 엽 니 다.

jsApiCal()함수 가 모든 동작 을 감청 합 니 다:
 res.err_msg get_brand_wcpay_request:cancel 전단 판단 의 지불 취소,es.errmsg 는 getbrand_wcpay_request:ok 은 전단 판단 의 지불 성공 을 나타 내 고 우 리 는 이것 에 따라 지불 을 성공 페이지 로 옮 길 수 있 습 니 다.
(4)성공 리 셋 지원
전단 jsApiCal()함 수 를 통 해 결제 결 과 를 감청 할 수 있 지만 믿 을 수 없습니다.지불 성공 여 부 를 확인 하려 면 notify.phop 을 통 해 업무 논 리 를 처리 해 야 합 니 다.앞쪽 에 결제 인증 링크 가 설정 되 어 있 습 니 다 SetNotifyurl(),결제 가 완료 되면 위 챗 서버 는 링크 에 따라 notify.phop 파일 을 자동 으로 요청 하여 이 파일 을 엽 니 다.사실 이 파일 의 가장 주요 한 코드 는 두 줄 입 니 다.

$notify = new PayNotifyCallBack(); 
$notify->Handle(false); 
WxPay.Notify.php 파일 의 Handle()함 수 를 추적 합 니 다.

/** 
 * 
 *      
 * @param bool $needSign          
 */ 
final public function Handle($needSign = true) 
{ 
 $msg = "OK"; 
 //   false   ,  notify   NotifyCallBack            ,         
 $result = WxpayApi::notify(array($this, 'NotifyCallBack'), $msg); 
 if($result == false){ 
  $this->SetReturn_code("FAIL"); 
  $this->SetReturn_msg($msg); 
  $this->ReplyNotify(false); 
  return; 
 } else { 
  //         NotifyCallBack  ,         
  $this->SetReturn_code("SUCCESS"); 
  $this->SetReturn_msg("OK"); 
 } 
 $this->ReplyNotify($needSign); 
} 
주 코드:

$result = WxpayApi::notify(array($this, 'NotifyCallBack'), $msg); 
그리고 WxPay.api.php 파일 의 411 줄 에 와 서 notify()함수:

/** 
 * 
 *          
 * @param function $callback 
 *           : notify(you_function); 
 *          :notify(array($this, you_function)); 
 * $callback    :function function_name($data){} 
 */ 
public static function notify($callback, &$msg) 
{ 
 //        
 $xml = $GLOBALS['HTTP_RAW_POST_DATA']; 
 //file_put_contents('log.txt',$xml,FILE_APPEND); 
 //            
 try { 
  $result = WxPayResults::Init($xml); 
 } catch (WxPayException $e){ 
  $msg = $e->errorMessage(); 
  return false; 
 } 
  
 return call_user_func($callback, $result); 
} 
이 안의$xml=$GLOBALS[HTTPRAW_POST_DATA']는 결제 가 성공 한 후에 사용자 가 당신 에 게 되 돌려 준 결과 입 니 다.그 는 xml 형식의 문자열 입 니 다.

우 리 는 이곳 에서 돌아 온 xml 데 이 터 를 기록 한 후에$out 를 열 어 볼 수 있 습 니 다.trade_no 는 지불 하기 전에 제 가 설정 한 주문 번호 입 니 다.$attach 는 설정 한 추가 매개 변수 입 니 다.
이 주문 번 호 를 얻 은 후에 나 는 바로 아래 에 지불 성공 후의 논 리 를 썼 다.예 를 들 어 데이터 베이스 중의 데 이 터 를 바 꾸 는 등 이다.
이렇게 위 챗 결제 의 JsApi 결 제 를 대충 분석 해 봤 습 니 다.

이것 은 공식 SDK 를 통합 하여 실현 한 것 으로 SDK 를 사용 하지 않 으 면 더욱 간단 한 방법 을 사용 할 수 있다.
총결산
위 에서 말 한 것 은 편집장 이 여러분 에 게 소개 한 PHP 가 위 챗 결제(jsapi 결제)절 차 를 상세 하 게 설명 하 는 것 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 저 에 게 메 시 지 를 남 겨 주세요.편집장 은 신속하게 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기