PHPでWeChat決済を導入する実践事例を詳しく解説

php中世界最好的语言
リリース: 2023-03-26 13:40:02
オリジナル
2427 人が閲覧しました

今回は、PHP で WeChat 決済を実装するための具体的な事例について詳しく説明します。PHP で 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) で WxPay を開きます。 lib フォルダー .Api.php ファイルの 537 行目には、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. 支払いプロセス

example ディレクトリ内の 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 '<font color="#f00"><b>统一下单支付单信息</b></font><br/>'; 
printf_info($order); 
$jsApiParameters = $tools->GetJsApiParameters($order);
ログイン後にコピー

は、WxPay.Api.phpの24行目のunifiedOrder()メソッドに対応し、注文情報と支払い

コールバック関数

を設定します。ここでいくつかのパラメータを変更する必要があります:

A.商品名:

$input->SetBody("test");
ログイン後にコピー

B. 注文番号

C. 支払い金額

がnotify.phpファイルの場所に設定されているので、ここに設定します: xy.chuyin .ren/weixinopen/wxpay/example/notify.php

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

データベース操作

を行うことができます。

$input->SetTotal_fee("1");
ログイン後にコピー

追加パラメータを入力するかどうかを指定できます。入力する場合は、文字列にスペースを含めないことをお勧めします。 。

この時点で、「Pay」をクリックすると、支払いが成功するはずです。

(3) 支払いを開始します

「Pay Now」ボタンをクリックして 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, '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['HTTP_RAW_POST_DATA'],就是支付成功后用户返回给你的一个结果,他是一个xml格式的字符串。

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

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

这样 微信支付的 JsApi支付就大致分析完成了。

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

相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!

推荐阅读:

PHP回调函数与匿名函数使用案例解析

PHP使用函数静态变量实现指定迭代次数步骤详解

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

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート