ホームページ  >  記事  >  バックエンド開発  >  PHPでWeChat決済を実装する方法

PHPでWeChat決済を実装する方法

藏色散人
藏色散人オリジナル
2021-09-13 09:11:1210260ブラウズ

WeChat 決済を実装する

php メソッド: 1. 公式デモをダウンロードする; 2. Curl ネットワーク リクエスト構成コードを変更する; 3. 基本情報の設定を完了する; 4. WxPay.Notify.php ファイルを変更する; 5 . パブリック アカウント バックエンドを設定します; 6. 支払いプロセスを完了します。

PHPでWeChat決済を実装する方法

この記事の動作環境: Windows 7 システム、PHP バージョン 7.1、DELL G3 コンピューター

php は WeChat をどのように実装しますか支払い?

PHP は WeChat 支払い (jsapi 支払い) プロセスを実装します

最近、WeChat 支払いに関連するプロジェクトに連絡しました。私は WeChat の開発を行っています。 , 私はまだ支払いをしていませんし、以前は赤い封筒を送るのに公開アカウントを使用しました。先輩たちの探索のおかげで、彼らのブログ投稿を読み、多くの回り道を省くことができました。

初期の準備:
1. WeChat 認証サービス アカウントと有効化された WeChat 支払い
2. WeChat 支払い 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.デモファイルの処理
(1) 公式デモをダウンロードします。ファイル名は WxpayAPI_php_v3 です。後でディレクトリを書きやすいように、このファイルの名前を wxpay に変更します。

(2) lib フォルダーの下にある WxPay.Api.php ファイルを開くと、A セクションがあります。 cURL によるピアの証明書の検証を無効にするために、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);//严格校验

に置き換えられます。

(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 つの証明書を独自のものに置き換えます。支払い証明書。

2. パブリック アカウントのバックグラウンド設定

(1) Web ページの承認済みドメイン名を設定します。私のドメイン名は (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

他のアドレスを書くこともできます。もちろん、支払い承認ドメイン名の下にある必要があります。支払いが成功すると、リンクで指定されたメソッドに自動的にコールバックされ、判定やデータベース操作を行うことができます。

$input->SetNotify_url("http://paysdk.weixin.qq.com/example/ Notice.php");

E. 追加パラメータ

$input->SetAttach("test");

追加パラメータは入力することも、入力しないこともできます。入力する場合は、文字列にスペースを含めないことをお勧めします。
この時点で、[Pay] をクリックすると正常に支払うことができるはずです。

(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>

[今すぐ支払う]ボタンをクリックすると、callpay() 関数が呼び出され、jsApiCall() 関数が呼び出され、支払いプログラムが開きます。


jsApiCall() 関数はアクションのすべてのステップを監視します:


## res.err_msg get_brand_wcpay_request:cancel はフロントエンドが支払いがキャンセルされたと判断したことを示し、es.err_msg は get_brand_wcpay_request:ok はフロントエンドが支払いが成功したと判断したことを示します。これ。

(4)成功コールバックのサポート


通过前端jsApiCall()函数可以监听支付结果,但是这个并不可信。确认是否支付成功还是应当通过notify.php 处理业务逻辑。前边配置好了支付验证链接SetNotify_url(),支付完成后,微信服务器会根据链接自动请求你的notify.php文件,打开这个文件,其实这个文件最主要的代码就两行:

$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行,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[&#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);
}

这里面的$xml=$GLOBALS['HTTP_RAW_POST_DATA'],就是支付成功后用户返回给你的一个结果,他是一个xml格式的字符串。


我们可以将这里返回的xml数据记录下来,然后打开看看$out_trade_no就是在支付之前我自己设置的订单号码,$attach就是设置的附加参数。

得到了这个订单号,然后我就直接在下面写支付成功后的逻辑了,比如改变数据库中的数据等等。

这样 微信支付的 JsApi支付就大致分析完成了。【推荐学习:《PHP视频教程》】


这是集成了官方的SDK实现的,如果不使用SDK,可以使用更简单的方法,见:PHP实现微信支付(jsapi支付)和退款(无需集成支付SDK)

以上がPHPでWeChat決済を実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。