PHP는 WeChat 결제 프로세스 공유를 구현합니다.

小云云
풀어 주다: 2023-03-21 19:34:02
원래의
16847명이 탐색했습니다.

이 기사에서는 주로 WeChat 결제를 PHP로 구현하는 과정을 공유합니다. 저는 최근 WeChat 결제와 관련된 프로젝트를 접하게 되었습니다. 하지만 공개 결제도 해본 적이 없습니다. 이전에 빨간 봉투를 보내려고 했던 선배님들의 도움에 감사드립니다. 탐색을 위해 선배님들의 블로그 게시물을 읽어서 많은 우회로를 구했습니다.
준비사항:
1. 위챗 인증 서비스 계정, 위챗 결제 활성화
2. 위챗 결제 SDK, 다운로드 주소: https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter =11_1
3. WeChat 결제 플랫폼 https://pay.weixin.qq.com/index.php/account/api_cert에 로그인하여 결제 인증서를 다운로드하세요.

방법 단계:
1. 데모 파일 처리
공식 데모 다운로드 후 파일 이름은 WxpayAPI_php_v3입니다. 나중에 디렉토리 작성의 편의를 위해 파일 이름을 wxpay로 변경합니다.

(2) lib 폴더 아래에 WxPay.Api.php 파일이 있습니다. 537행에서 구성을 요청합니다. 코드:

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이 피어의 인증서를 확인하지 못하도록 합니다.

(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) 인증서 인증서 디렉터리를 열고 내부의 두 인증서를 자신의 결제 인증서로 바꿉니다.

2. 공식 계정 배경 설정

(1) 웹페이지 승인 도메인 이름을 구성합니다. 내 도메인 이름은 (xy.chuyin.ren)입니다. (1) 결제 승인 디렉터리를 구성합니다. 도메인 이름은 (xy.chuyin.ren)이고, 이 도메인 이름이 가리키는 디렉토리의 weixinopen/ 폴더에 데모를 넣었습니다. 데모의 jsapi.php 파일은 example/ 디렉토리에 있으므로 결제 승인이 이루어집니다. 디렉토리는 xy.chuyin.ren/weixinopen/wxpay/example/


3. 결제 프로세스

예제 디렉토리에서 jsapi.php 파일을 열면 결제 시작 및 처리가 모두 완료됩니다.

(1) 사용자 openid 가져오기

이전에 APPID 및 APPSecert를 구성했으므로 여기서 처리할 필요가 없습니다.

//①、获取用户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 &#39;<font color="#f00"><b>统一下单支付单信息</b></font><br/>&#39;;
printf_info($order);
$jsApiParameters = $tools->GetJsApiParameters($order);
로그인 후 복사

은 WxPay.Api.php의 24번째 줄에 있는 UnifiedOrder() 메소드에 해당하며, 주문 정보 및 결제 콜백 기능을 구성합니다. 여기에서 여러 매개변수를 수정해야 합니다.

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로 설정했습니다. 물론 결제 승인 도메인 아래에 있어야 합니다. 결제가 성공하면 자동으로 링크에 지정된 메소드로 콜백되어 판단 및 데이터베이스 작업을 수행할 수 있습니다. .com/example/notify.php");

E. 추가 매개변수

$input->SetAttach("test");
로그인 후 복사

추가 매개변수는 입력할 수도 있고 안 입력할 수도 있습니다. 입력할 경우 문자열에 공백을 넣지 않는 것이 가장 좋습니다.

이때 결제를 클릭하시면 결제가 성공됩니다.

(3) 결제 시작

<script type="text/javascript">
//调用微信JS api 支付
function jsApiCall()
{
	WeixinJSBridge.invoke(
		&#39;getBrandWCPayRequest&#39;,
		<?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(&#39;WeixinJSBridgeReady&#39;, jsApiCall, false);
		}else if (document.attachEvent){
			document.attachEvent(&#39;WeixinJSBridgeReady&#39;, jsApiCall); 
			document.attachEvent(&#39;onWeixinJSBridgeReady&#39;, jsApiCall);
		}
	}else{
		jsApiCall();
	}
}
</script>
로그인 후 복사
Pay Now 버튼을 클릭하여 callpay() 함수를 호출하면 jsApiCall() 함수가 호출되어 결제 프로그램이 열립니다.


jsApiCall() 함수는 모든 작업을 모니터링합니다.

res.err_msg는 프런트 엔드에서 판단한 결제 취소를 나타내는 get_brand_wcpay_request:cancel이고, es.err_msg는 결제 전을 나타내는 get_brand_wcpay_request:ok입니다. 성공으로 판단되면 이를 기반으로 결제 성공 페이지로 리디렉션할 수 있습니다.

(4) 성공 콜백 지원

프론트엔드 jsApiCall() 함수를 통해 결제 결과를 모니터링할 수 있지만 이는 신뢰할 수 없습니다. 결제 성공 여부를 확인하려면 inform.php를 통해 비즈니스 로직을 처리해야 한다. 결제 확인 링크 SetNotify_url()은 이전에 구성되었습니다. 결제가 완료된 후 WeChat 서버는 링크에 따라 자동으로 inform.php 파일을 요청하고 이 파일을 엽니다. 실제로 이 파일의 주요 코드는 2개뿐입니다. 라인:

$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, &#39;NotifyCallBack&#39;), $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, &#39;NotifyCallBack&#39;), $msg);
로그인 후 복사

그런 다음 WxPay.Api.php 파일의 라인 411로 이동하세요, inform() 함수:

/**
 * 
 * 支付结果通用通知
 * @param function $callback
 * 直接回调函数使用方法: notify(you_function);
 * 回调类成员函数方法:notify(array($this, you_function));
 * $callback  原型为:function function_name($data){}
 */
public static function notify($callback, &$msg)
{
	//获取通知的数据
	$xml = $GLOBALS[&#39;HTTP_RAW_POST_DATA&#39;];
	//file_put_contents(&#39;log.txt&#39;,$xml,FILE_APPEND);
	//如果返回成功则验证签名
	try {
		$result = WxPayResults::Init($xml);
	} catch (WxPayException $e){
		$msg = $e->errorMessage();
		return false;
	}
	
	return call_user_func($callback, $result);
}
로그인 후 복사

=$GLOBALS['HTTP_RAW_POST_DATA'] 내의 $xml은 결제가 성공한 후 사용자가 반환한 결과입니다. xml 형식의 문자열입니다.

여기에 반환된 xml 데이터를 기록하고 열어서 확인할 수 있습니다. $out_trade_no는 결제 전 설정한 주문 번호이고, $attach는 추가 매개변수 설정입니다.

주문번호를 받은 뒤 데이터베이스의 데이터 변경 등 결제 성공 후 로직을 바로 아래에 작성했습니다.

이렇게 WeChat 결제의 JsApi 결제를 대략적으로 분석합니다.


이것은 공식 SDK를 통합하여 구현됩니다. SDK를 사용하지 않는 경우 더 간단한 방법을 사용할 수 있습니다. 참조: WeChat 결제(jsapi 결제) 및 환불 구현(결제 통합 필요 없음) SDK)

관련 추천:

WeChat 결제 환불 기능 개발

PHP WeChat 결제 개발 및 Alipay 결제 예시

PHP WeChat 결제 개발 WeChat 환불 기능 예시

위 내용은 PHP는 WeChat 결제 프로세스 공유를 구현합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿