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

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

php中世界最好的语言
php中世界最好的语言オリジナル
2018-03-24 10:11:484743ブラウズ

今回は、PHP で WeChat 決済を実装する方法を説明します。PHP で WeChat 決済を実装するための 注意事項 は何ですか? 以下に実際のケースを見てみましょう。

最近、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) で 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.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. 注文番号

$input->SetOut_trade_no(WxPayConfig::MCHID.date("YmdHis"));
C. 支払い金額

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

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

データベース操作

を行うことができます。

$input->SetTotal_fee("1");

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

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

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

$input->SetNotify_url(http://paysdk.weixin.qq.com/example/notify.php);
「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中文网其它相关文章!

推荐阅读:

用AngularJS在前端界面获取密码

小程序的Promise简化回调

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

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