ThinkPHP 구현 위 챗 결제(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 결제)절차 에 대한 상세 한 설명 입 니 다.여러분 께 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 메 시 지 를 남 겨 주세요.편집장 님 께 서 신속하게 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
위 챗 내 장 된 브 라 우 저 여 부 를 판단 합 니 다.자바 버 전 javascript 버 전...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.