ホームページ WeChat アプレット WeChatの開発 ThinkPHP は WeChat 支払い (jsapi 支払い) を実装します

ThinkPHP は WeChat 支払い (jsapi 支払い) を実装します

Jun 07, 2018 pm 03:52 PM
tp5 支払う

この記事では主に ThinkPHP で WeChat 決済 (jsapi 決済) を実装する方法についての詳細なチュートリアルを紹介します。必要な方は参考にしてください。

WeChat 決済 (jsapi 決済) を実装するプロセスについては以前に記事を書きました。 PHP 詳細については、「PHP による WeChat 支払い (jsapi 支払い) プロセスの実装」を参照してください。

当時の環境はフレームワークを使用せず、ドメイン名で指定されたディレクトリの下に直接新規ディレクトリを作成し、そのディレクトリにアクセスするという方法で実装していましたが、フレームワークに適用するとまだいくつか問題がありました。 ThinkPHPでは、ルーティングルールと支払い承認ディレクトリにより齟齬が生じるため、エラーが報告されます。この記事では、WeChat 支払いを TP に統合するプロセスについて説明します。

Goose Factory によって作成された SDK とドキュメントは理解するのが難しく、使用するとどれだけ新鮮であるかがわかります。ドキュメントと SDK はできるだけシンプルで理解しやすいものであるべきではないでしょうか?精力的な再構築だけがGoose Factoryプログラマーの優れた技術を示すことができるのでしょうか?うーん…新人属性をさらけてしまったのか…実際、SDKは非常に使いやすいのですが、前回の記事で見たように、支払い完了のコールバック関数が非常にわかりにくいのです。

公式にバイパスされたくない、TP で WeChat 決済を使用したい方は、公式ドキュメントに基づいてマスターによって再構築され、効率化された TP に適した決済 SDK をご覧ください。ソースコードをダウンロードして見てみました。コードが書かれています。導入は非常にエレガントで、プロセスはシンプルで理解しやすいです。詳細については、ブログ投稿を参照してください: http://baijunyao.com/article/78

私はまだ眉をひそめながらも公式 SDK を使用し、支払いを正常に実装しました:

1.SDK のダウンロード変更

これについてはあまり詳しく説明しませんので、ご存じない方は、私の前回の記事をご覧ください: PHP は WeChat 支払い (jsapi 支払い) プロセスを実装しており、ダウンロードしたファイルを変更する必要があることが詳しく説明されています。

2. 公式アカウントの設定

A. Web ページの認証ドメイン名を設定する必要がありますが、これは特別なことではありません

B. ここでの支払い認証ディレクトリに注意してください。モード (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。それに対応するモジュール(WexinApi. Application/ ディレクトリ内のコントローラー (WeixinPay)、およびメソッド (通知):

// 检测PHP环境 
if(version_compare(PHP_VERSION,&#39;5.3.0&#39;,&#39;<&#39;)) die(&#39;require PHP > 5.3.0 !&#39;); 
// $_GET[&#39;m&#39;]=&#39;Admin&#39;; 
// 开启调试模式 建议开发阶段开启 部署阶段注释或者设为false 
define(&#39;APP_DEBUG&#39;,True); 
//指定模块控制器和方法 
$_GET[&#39;m&#39;]=&#39;WexinApi&#39;; 
$_GET[&#39;c&#39;]=&#39;WeixinPay&#39;; 
$_GET[&#39;a&#39;]=&#39;notify&#39;; 
// 定义应用目录 
define(&#39;APP_PATH&#39;,&#39;./Application/&#39;); 
define("APP_ROOT",dirname(__FILE__)); 
// 引入ThinkPHP入口文件 
require &#39;./ThinkCore/ThinkCore.php&#39;; 
// 亲^_^ 后面不需要任何代码了 就是如此简单
ログイン後にコピー

次に、http://serverName/payment.php にアクセスし、http://serverName/payment/weixinPay/ と直接入力します。通知するため、コールバック検証リンクは 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 = &#39;&#39;; 
 $jsApiParameters = wxpay($openId,&#39;江南极客&#39;,$order_sn,1); 
 $this->assign(array( 
  &#39;data&#39; => $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( 
   &#39;getBrandWCPayRequest&#39;, data, 
   function(res){ 
    WeixinJSBridge.log(res.err_msg); 
    //alert(&#39;err_code:&#39;+res.err_code+&#39;err_desc:&#39;+res.err_desc+&#39;err_msg:&#39;+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(&#39;WeixinJSBridgeReady&#39;, jsApiCall, false); 
   }else if (document.attachEvent){ 
    document.attachEvent(&#39;WeixinJSBridgeReady&#39;, jsApiCall); 
    document.attachEvent(&#39;onWeixinJSBridgeReady&#39;, 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/> 
 <p 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> 
 </p> 
</body> 
</html>
ログイン後にコピー

しかし、支払いページの URL には多くのパラメータが必要であるため、支払いページの URL には注意する必要があります。先ほど、で使用される REWRITE モードについて説明しました。 TP、あなたのリンク [ http://serverName/Home/Blog/read/id/1 ] に似ていますが、より多くのパラメーターがある場合があります。この時点で、WeChat Pay はあなたの支払い承認ディレクトリが [ 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[&#39;HTTP_RAW_POST_DATA&#39;]; 
 // 这句file_put_contents是用来查看服务器返回的XML数据 测试完可以删除了 
 file_put_contents(&#39;./Api/wxpay/logs/log.txt&#39;,$xml,FILE_APPEND); 
 //将服务器返回的XML数据转化为数组 
 //$data = json_decode(json_encode(simplexml_load_string($xml,&#39;SimpleXMLElement&#39;,LIBXML_NOCDATA)),true); 
 $data = xmlToArray($xml); 
 // 保存微信服务器返回的签名sign 
 $data_sign = $data[&#39;sign&#39;]; 
 // sign不参与签名算法 
 unset($data[&#39;sign&#39;]); 
 $sign = $this->makeSign($data); 
 // 判断签名是否正确 判断支付状态 
 if ( ($sign===$data_sign) && ($data[&#39;return_code&#39;]==&#39;SUCCESS&#39;) && ($data[&#39;result_code&#39;]==&#39;SUCCESS&#39;) ) { 
  $result = $data; 
  // 这句file_put_contents是用来查看服务器返回的XML数据 测试完可以删除了 
  file_put_contents(&#39;./Api/wxpay/logs/log1.txt&#39;,$xml,FILE_APPEND); 
  //获取服务器返回的数据 
  $order_sn = $data[&#39;out_trade_no&#39;]; //订单单号 
  $order_id = $data[&#39;attach&#39;];  //附加参数,选择传递订单ID 
  $openid = $data[&#39;openid&#39;];   //付款人openID 
  $total_fee = $data[&#39;total_fee&#39;]; //付款金额 
  //更新数据库 
  $this->updateDB($order_id,$order_sn,$openid,$total_fee); 
 }else{ 
  $result = false; 
 } 
 // 返回状态给微信服务器 
 if ($result) { 
  $str=&#39;<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>&#39;; 
 }else{ 
  $str=&#39;<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[签名失败]]></return_msg></xml>&#39;; 
 } 
 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)

以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!

相关推荐:

php服务端集成支付宝APP支付

基于thinkPHP实现的微信自定义分享功能


以上がThinkPHP は WeChat 支払い (jsapi 支払い) を実装しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

百度地図でのタクシー料金の支払い方法. タクシー料金の支払い手順を紹介します。 百度地図でのタクシー料金の支払い方法. タクシー料金の支払い手順を紹介します。 Mar 13, 2024 am 10:04 AM

Baidu Map APP は現在、多くのユーザーに好まれる旅行ナビゲーション ソフトウェアとなっているため、ここにある機能の一部は包括的であり、毎日の旅行で遭遇する可能性のある問題のいくつかを解決するために無料で選択して操作できます。自分だけの旅行ルートを設定して、自分だけの旅行プランを立てましょう。該当するルートを確認した上で、公共交通機関を利用しても、自転車、徒歩、タクシーなど、目的に応じて適切な移動方法を選択することができます。あなたのニーズに対応したナビゲーションルートがあり、特定の場所にうまく導くことができます。そうすれば、誰もがタクシーを利用することを選択した場合、より便利だと感じるでしょう。多くのドライバーがいます。彼らは皆、オンラインで注文を受け付け、タクシー配車は可能です。超になる

uniapp アプリケーションが支払いと注文の管理を実装する方法 uniapp アプリケーションが支払いと注文の管理を実装する方法 Oct 19, 2023 am 10:37 AM

uniapp は、小さなプログラム、アプリ、および H5 を同時に開発できるクロスプラットフォームのアプリケーション開発フレームワークです。 uniapp アプリケーションでは、支払いと注文の管理が非常に一般的なニーズです。この記事では、uniappアプリケーションに決済機能や注文管理を実装する方法と具体的なコード例を紹介します。 1. 決済機能の実装 決済機能はオンライン取引を実現するための鍵であり、通常、サードパーティの決済プラットフォームの SDK を統合する必要があります。 uniapp に支払い機能を実装するための具体的な手順は次のとおりです。 サードパーティの支払いプラットフォームを登録して取得します。

PHP と PayPal API を使用して支払う PHP と PayPal API を使用して支払う Jun 19, 2023 pm 04:13 PM

オンライン取引の普及に伴い、支払い方法も徐々に多様化しており、その中でもPayPalは広く利用されている支払い方法として非常に人気があります。 PayPal を使用して Web サイトまたはアプリケーションでトランザクションを処理する場合は、PHP と PayPal API を使用して支払いプロセスを簡単に完了できます。 PayPalAPI は、PayPal と対話するためのプログラミング インターフェイスのセットです。 API を介して、PayPal から通知を受け取り、最新の取引情報を照会し、支払いを開始できます。

武漢でのバスの支払い方法 武漢でのバスの支払い方法 Oct 13, 2022 pm 02:17 PM

武漢のバスの支払い方法: 1. 現金で支払う場合は、事前に十分な小銭を用意し、コインスロットに直接お金を入れる必要があります; 2. 武漢通カードをスワイプします (武漢通の正式名称は武漢市カードです) 、チップカードとしても知られる集積回路カードです; 3. Alipay 電子バス カード、最初に Alipay で武漢電子バス カードを取得し、バスに乗るときに QR コードを直接スキャンしてお金を差し引きます; 4. WeChatバスコード支払い、WeChat「乗車コード」アプレットを開き、武漢「乗車コード」をアクティブ化すると、QRコードを直接スキャンして支払いを差し引いてバスに乗車できます。

Meituan Takeout Express Paymentの終了方法 Meituan Takeout Express Paymentの終了方法 Mar 27, 2024 am 10:41 AM

ペースの速い現代生活の中で、美団テイクアウトは便利なサービスと豊富な選択肢で消費者に深く愛されています。中でも超高速決済機能は、煩雑な入力作業を省き、ワンクリックで決済が完了するため、ユーザーにとって大きな利便性をもたらします。ただし、多くのユーザーは確認なしで直接支払うことを好まないため、この機能をオフにしたいと考えています。では、Meituan Waimai の高速支払いをオフにするにはどうすればよいでしょうか?以下では、この Web サイトの編集者が詳細なステップバイステップのセットアップ チュートリアルを提供します。お役に立てれば幸いです。 1. 携帯電話のデスクトップにある「Meituan Takeout」ショートカット アイコンをクリックします。 2. 携帯電話で Meituan テイクアウト アプリにログインし、右下の [マイ] をクリックします。 3. マイインターフェースで、「ウォレットを入力」をクリックします。 4. Meituan Wallet インターフェースで、右上隅の「設定」アイコンをクリックします。

ペイノー支払いとはどういう意味ですか? ペイノー支払いとはどういう意味ですか? Sep 30, 2022 am 11:01 AM

PayNow 支払いは電子送金サービスであり、ユーザーは、受取人が指定した携帯電話番号、ID カード/FIN 番号、UEN 番号、または PayNow QR コードを介して、相手方を介さずに受取人へのリアルタイム SGD 送金を直接開始できます。銀行口座情報。

MySQL で食料品ショッピング システムの注文支払いテーブルを確立する MySQL で食料品ショッピング システムの注文支払いテーブルを確立する Nov 01, 2023 pm 03:48 PM

MySQL で食料品ショッピング システムの注文支払いテーブルを構築するには、具体的なコード例が必要です インターネットの発達により、買い物はますます便利になりました。ショッピング プロセスにおいて、注文の支払いはショッピング プロセスの重要な部分です。食料品ショッピング システムには、注文生成機能が必要なだけでなく、支払いが成功した場合のみ取引が完了したとみなされるため、完全な支払いプロセスも必要です。この記事では、MySQL で食料品ショッピング システムの注文支払いテーブルを作成する方法を説明し、具体的なコード例を示します。 1. 注文支払いテーブルの設計 食料品ショッピング システムの注文支払いテーブルには注文が保存されます。

支払いが有効な場合、デフォルトで Meituan インスタント割引が差し引かれる場所_ 支払いが有効な場合、デフォルトで差し引かれる Meituan インスタント ディスカウントに関するチュートリアル 支払いが有効な場合、デフォルトで Meituan インスタント割引が差し引かれる場所_ 支払いが有効な場合、デフォルトで差し引かれる Meituan インスタント ディスカウントに関するチュートリアル Mar 28, 2024 am 11:00 AM

1. まず [Meituan] アプリを開き、下部のナビゲーション バーの [My] ボタンをクリックします。 2. [My Wallet] 機能ボタンをクリックし、[Cash Voucher] ボタンをクリックします。 3. 次に、上部の機能バーで [即時控除] ボタンをクリックし、スイッチ ボタンをクリックして [支払い中のデフォルト控除] をオンにすると、正常にオンになります。

See all articles