この記事では主に WeChat 決済と Alipay 決済の PHP 開発例について説明します。支払いプロセスについては説明がありません。PHP 中国語 Web サイトで自分で検索できます。
WeChat支払い
项目前提:本人用的是tp框架,PHP语言下载到微信平台提供的微信支付接口文件,放在了tp第三方类库vendor,命名为WxpayAPI,
WxpayAPI/lib/WxPay.Api.php 接口访问类; WxpayAPI/lib/WxPay.Config.php 配置账号信息; WxpayAPI/lib/WxPay.Data.php 数据对象基础类; WxpayAPI/lib/WxPay.Exception.php 微信支付API异常类; WxpayAPI/lib/WxPay.Notify.php 回调基础类 WxpayAPI/example/WxPay.JsApiPay.php JSAPI支付实现类
1 ソースコードを一部変更しました
(1)WxPay.Api.php 里注释掉 //require_once "WxPay.Exception.php"; //require_once "WxPay.Config.php"; //require_once "WxPay.Data.php"; (2)WxPay.Config.php里 需要根据商户信息对APPID , MCHID ,KEY , APPSECRET 进行配置。 (3)WxPay.Data.php 里注释掉 //require_once "WxPay.Config.php"; //require_once "WxPay.Exception.php"; (4)WxPay.JsApiPay.php 里注释掉 //require_once "../lib/WxPay.Api.php";
これらを設定したら、次のステップが重要な部分です。
2. 注文コントローラー GoodsController.class.php には、注文関数sure()とコールバック情報関数Callback_url()があります
/** * 提交订单函数 */ public function sure() { $o_model = D("Wine/Orders"); if (IS_AJAX) { $data = I("post."); if ($o_model->create($data)) { if (!sp_check_verify_code()) { $this->error("验证码错误!"); } #生成随机订单号 $order_code = 'O' . date('YmdHis') . $o_model->get_order_code(4); while ($o_model->findone(array("order_code" => $order_code))) { $order_code = 'O' . date('YmdHis') . $o_model->get_order_code(4); } $data['order_code'] = $order_code; $addr[0] = $_POST['prov']; $addr[1] = $_POST['city']; $addr[2] = $_POST['dist']; $addr[3] = $_POST['area']; $data['area'] = serialize($addr); $data['create_time'] = time(); $data['update_time'] = time(); if ($data['pay_id'] == 1) { $data['order_status'] = 11; //已付款 $data['status'] = '1'; } else { $data['order_status'] = 10; //待付款 $data['status'] = '1'; } //函数调用 返回信息 $this->Callback_url($data); } else { $this->error($o_model->getError()); } } else { $this->error($o_model->getError()); } } /** * 回调信息函数 * @param type $data */ public function Callback_url($data) { $o_model = D("Wine/Orders"); $add_id = $o_model->add($data); if (!$add_id) { $this->error("订单提交失败,请稍后重试!"); } if ('4' == $data['pay_id']) { if ('4' == $data['pay_id']) { //微信支付 $msg = '正在为您跳转到微信支付页面,请等待……'; $url = "/index.php/wine/wxpay/index/?o_id=$add_id"; } $this->success("订单提交成功!" . $msg, $url); }
3.【強調! ! ! ] WxpayController .class.php WeChat 支払いコントローラーは WeChat インターフェイスへの呼び出しを実装します
<?php /** * 微信支付接口调用 */ namespace Wine\Controller; use Common\Controller\HomebaseController; class WxpayController extends HomebaseController { public function _initialize() { parent::_initialize(); Vendor("WxpayAPI/example/log");//订单数据写入日志 //注: 引入第三方类库中的微信接口文件,对于文件名含有.的,皆用#代替连接才能引入,后缀名不写。 Vendor("WxpayAPI/example/WxPay#JsApiPay"); Vendor("WxpayAPI/lib/WxPay#Config"); Vendor("WxpayAPI/lib/WxPay#Data"); Vendor("WxpayAPI/lib/WxPay#Exception"); Vendor("WxpayAPI/lib/WxPay#Notify"); Vendor("WxpayAPI/lib/WxPay#Api"); //初始化日志 $logHandler = new \CLogFileHandler("/projects/wine.huishuocs.com/data/pay_log/" . date('Y-m-d') . '.log'); $log = \Log::Init($logHandler, 15); $this->model = D("Wine/Orders"); $this->url = MODULE_NAME . '/' . CONTROLLER_NAME . '/index'; } /** * 显示支付页面 * */ public function index() { // 判断当前订单是否被支付 $orderid = I("get.o_id", 0, "intval"); $orderid || $this->error("非法操作!"); $this->assign('orderid',$orderid); $info = $this->model->findone(array("a.id" => $orderid, 'a.status' => array('neq', '-1'))); $info || $this->error("暂未查询到该订单!"); //10代表订单待支付的状态 if ($info['order_status'] != 10) { $this->error("订单已支付!"); } //①、获取用户openid $tools = new \JsApiPay(); $openId = $tools->GetOpenid(); #无法使用 //初始化日志 \Log::INFO('订单' . var_export($info, true)); $out_trade_no = \WxPayConfig::MCHID . date("YmdHis"); $this->model->where(array("id" => $orderid))->save(array('out_trade_no' => $out_trade_no)); // $openId ="123"; #无法使用 //②、统一下单 $input = new \WxPayUnifiedOrder(); $input->SetBody($info['mode_name']); $input->SetAttach($orderid); $input->SetOut_trade_no($out_trade_no); // $input->SetTotal_fee($orderArr['total_price']*100);实际支付价格 $input->SetTotal_fee($info['pay_price']*100); //测试时请将支付价格改为0.01,土豪请避开此注释 $this->assign('pay_price',$info['pay_price']); $input->SetTime_start(date("YmdHis")); $input->SetTime_expire(date("YmdHis", time() + 600)); // $input->SetGoods_tag("test");# 优惠券 $input->SetNotify_url('http://' . $_SERVER['HTTP_HOST'] . "/index.php/Wine/Wxpay/callback"); //回调地址 $input->SetTrade_type("JSAPI"); $input->SetOpenid($openId); $order = \WxPayApi::unifiedOrder($input); // echo '<font color="#f00"><b>统一下单支付单信息</b></font><br/>'; // $this->printf_info($order);//打印参数 $this->assign('o_id',$orderid); $this->assign('jsApiParameters', $tools->GetJsApiParameters($order)); //获取共享收货地址js函数参数 // $this->assign('editAddress', $tools->GetEditAddressParameters()); $this->display('wxpay'); exit; } /** * 打印输出数组信息 * @param type $data */ public function printf_info($data) { foreach ($data as $key => $value) { echo "<font color='#00ff55;'>$key</font> : $value <br/>"; } } /* 支付成功回调函数 */ public function callback() { /* 返回给微信服务器 */ // $mes = array( // 'return_code' => 'SUCCESS', // 'return_msg' => 'OK' // ); // $this->ajaxReturn($mes, 'XML'); $logHandler = new \CLogFileHandler("/projects/wine.huishuocs.com/data/pay_log/" . date('Y-m-d') . '.log'); $log = \Log::Init($logHandler, 15); //$streamData = isset($GLOBALS['HTTP_RAW_POST_DATA']) ? $GLOBALS['HTTP_RAW_POST_DATA'] : ''; $streamData = file_get_contents('php://input'); if ($streamData != '') { $arr = $this->xmlToArray($streamData); \Log::INFO('支付' . var_export($arr, true)); } else { $ret = false; } // 回调值 if (!empty($arr)) { # 数据 \Log::INFO('数据1' . var_export($arr, true)); #修改订单状态 $out_trade_no = $arr['out_trade_no']; $newArr = array('order_status' => 11,'status'=>1); $this->model->where(array("out_trade_no" => $out_trade_no))->save($newArr); $info = $this->model->findone(array("a.out_trade_no" => $out_trade_no, 'a.status' => array('neq', '-1'))); $sql = $this->model->getLastSql(); \Log::INFO('数据2' . $sql); #添加支付记录pay $pay = array( 'payment_code' => 'wxpay', 'trade_no'=>$info['order_code'], 'out_trade_no'=>$out_trade_no, 'order_id'=>$info['id'], 'create_time'=>time() ); M('payment_record')->add($pay); } /* 返回给微信服务器 */ $mes = array( 'return_code' => 'SUCCESS', 'return_msg' => 'OK' ); $this->ajaxReturn($mes, 'XML'); } //将XML转为array public function xmlToArray($xml) { //禁止引用外部xml实体 libxml_disable_entity_loader(true); $values = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true); return $values; } } ?>
<html> <head> <meta http-equiv="content-type" content="text/html;charset=utf-8"/> <meta name="viewport" content="width=device-width, initial-scale=1"/> <link href="__TMPL__Public/css/weui.css" type="text/css" rel="stylesheet"/> <title>微信订单支付</title> <script type="text/javascript"> //调用微信JS api 支付 function jsApiCall() { WeixinJSBridge.invoke( 'getBrandWCPayRequest', <php> echo $jsApiParameters; </php>, function(res) { WeixinJSBridge.log(res.err_msg); if (res.err_msg == "get_brand_wcpay_request:ok") { // alert(res.err_code + res.err_desc + res.err_msg); // 成功跳转页面 window.location.href = '{:U("Orders/pay_ok",array("o_id"=>$o_id))}'; } else { // 统一跳转 } } ); } function callpay() { if (typeof WeixinJSBridge == "undefined") { if (document.addEventListener) { document.addEventListener('WeixinJSBridgeReady', jsApiCall, false); } else if (document.attachEvent) { document.attachEvent('WeixinJSBridgeReady', jsApiCall); document.attachEvent('onWeixinJSBridgeReady', jsApiCall); } } else { jsApiCall(); } } </script> </head> <body> <br/> <p class="container" id="container"><p class="msg"> <p class="weui_msg"> <p class="weui_icon_area"><i class="weui_icon_success weui_icon_msg"></i></p> <p class="weui_text_area"> <h2 id="订单已生成">订单已生成</h2> <p class="weui_msg_desc">该笔订单支付金额为:<php> echo $pay_price;</php></p> </p> <p class="weui_opr_area"> <p class="weui_btn_area"> <a href="javascript:;" class="weui_btn weui_btn_primary" onclick="callpay()">立即支付</a> <!--<a href="{:U('Order/pay_ok',array('o_id'=>$_GET['o_id']))}" class="weui_btn weui_btn_default">取消支付</a>--> </p> </p> <!-- <p class="weui_extra_area"> <a href="/wap/order/order_det/<?php echo $order['id']?>.html">查看详情</a> </p>--> </p> </p> </p> </body> </html>
Alipay で支払う
注:1.支付文件是从支付宝上直接拿过来的2.依旧是TP框架
【1】将文件放入第三方类库:
/** * 支付页面 */ public function pay_ok() { $o_id = I("get.o_id", 0, "intval"); $info = $this->model->findone(array("a.id" => $o_id, 'a.status' => array('neq', '-1'))); if (empty($info)) { # 获取最新可用的商品编号 $goods = D('Goods')->where(array('status' => '1'))->order('id desc')->find(); $this->error("该订单不存在,请重新正确进入", U('Goods/sale', array('id' => $goods['id']))); } $this->assign('imgurl', "/wine/img/ok.png"); $this->assign('tips', "订购成功"); if ('4' == $info['pay_id']) { //微信支付成功 $this->assign($info); $this->display(); } else { $this->assign($info); $this->assign('tips', "订购失败"); $this->assign('imgurl', "/wine/img/nook.png"); $this->display(); } }
(1) * 类名:AlipayConfig.php * 功能:支付宝配置文件 * 修改配置: // MD5密钥,安全检验码,由数字和字母组成的32位字符串,查看地址:https://b.alipay.com/order/pidAndKey.htm $alipay_config['key'] = '';//(**从支付宝中获取**) // 服务器异步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问 $alipay_config['notify_url'] = 'http://' . $_SERVER['SERVER_NAME'] . '/index.php/Wine/PayCallback/alipay_notify'; // 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问 $alipay_config['return_url'] = 'http://' . $_SERVER['SERVER_NAME'] . '/index.php?g=Wine&m=Orders&a=alipay_return'; (2) * 类名:AlipayNotify.php * 功能:支付宝通知处理类 * 详细:处理支付宝各接口通知返回 (3) * 类名:Alipay.php * 功能:手机网站支付接口接入页 * 详细:处理支付宝各接口通知返回 class Alipay { public function submit($params) { //建立请求 $alipaySubmit = new AlipaySubmit($alipay_config); $html_text = $alipaySubmit->buildRequestForm($parameter, "get", "确认"); return '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>支付宝支付</title> </head>' . $html_text . ' </body> </html>'; } } (4) * 类名:notify_url.php * 功能:支付宝服务器异步通知页面 * 详细:处理支付宝各接口通知返回
【2】支付业务逻辑 (1)GoodsController.class.php 下提交订单 ajax_sure() public function ajax_sure() {<br> $data['order_code'] = $order_code; $addr[0] = $_POST['prov']; $addr[1] = $_POST['city']; $addr[2] = $_POST['dist']; $addr[3] = $_POST['area']; $data['area'] = serialize($addr); $data['create_time'] = time(); $data['update_time'] = time(); $data['ip'] = $_SERVER['REMOTE_ADDR']; if ($data['pay_id'] == 1) { $data['order_status'] = 11; //已付款 $data['status'] = '1'; } else { $data['order_status'] = 10; //待付款 $data['status'] = '1'; } //函数调用 返回信息 $this->Callback_url($data); } /** * 回调信息函数 * @param type $data */ public function Callback_url($data) { $o_model = D("Wine/Orders"); $add_id = $o_model->add($data); if (!$add_id) { $this->error("订单提交失败,请稍后重试!"); }<br> if ('3' == $data['pay_id']) { //支付宝支付 $msg = '正在为您跳转到支付宝支付页面,请等待……'; $url = U("Pay/doalipay", array('o_id' => $add_id)); } $this->success("订单提交成功!" . $msg, $url); } (2)PayController.class.php 下 /** * 支付页面 */ public function doalipay() { $o_id = I("get.o_id", 0, "intval"); $info = $this->model->findone(array("a.id" => $o_id, 'a.status' => array('neq', '-1'))); //10代表订单待支付的状态 if ($info['order_status'] != 10) { $this->error("订单已支付!"); } vendor("Payment.Alipay.Alipay"); $alipay = new \Alipay(); $param['order_sn'] = $info['order_code']; // $param['order_amount'] = $info['pay_price']; $param['order_amount'] = 0.01;//测试支付时,将支付价格设为0.01元,土豪朋友忽略此提示O(∩_∩)O~ $param['order_subject'] = '支付宝支付测试'; $param['return_url'] = 'http://' . $_SERVER['SERVER_NAME'] . '/index.php/Wine/Orders/pay_ok/o_id/'.$o_id; $return = $alipay->submit($param); echo $return; exit; }この時点で、Alipay の支払いプロセスは完了です。
WeChat 決済エンタープライズ決済サンプル コードの PHP 開発
以上がWeChat 決済と Alipay 決済の PHP 開発サンプルの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

まだ人気があるのは、使いやすさ、柔軟性、強力なエコシステムです。 1)使いやすさとシンプルな構文により、初心者にとって最初の選択肢になります。 2)Web開発、HTTP要求とデータベースとの優れた相互作用と密接に統合されています。 3)巨大なエコシステムは、豊富なツールとライブラリを提供します。 4)アクティブなコミュニティとオープンソースの性質は、それらを新しいニーズとテクノロジーの傾向に適応させます。

PHPとPythonはどちらも、Web開発、データ処理、自動化タスクで広く使用されている高レベルのプログラミング言語です。 1.PHPは、ダイナミックウェブサイトとコンテンツ管理システムの構築によく使用されますが、PythonはWebフレームワークとデータサイエンスの構築に使用されることがよくあります。 2.PHPはエコーを使用してコンテンツを出力し、Pythonは印刷を使用します。 3.両方ともオブジェクト指向プログラミングをサポートしますが、構文とキーワードは異なります。 4。PHPは弱いタイプの変換をサポートしますが、Pythonはより厳しくなります。 5. PHPパフォーマンスの最適化には、Opcacheおよび非同期プログラミングの使用が含まれますが、PythonはCprofileおよび非同期プログラミングを使用します。

PHPは主に手順プログラミングですが、オブジェクト指向プログラミング(OOP)もサポートしています。 Pythonは、OOP、機能、手続き上のプログラミングなど、さまざまなパラダイムをサポートしています。 PHPはWeb開発に適しており、Pythonはデータ分析や機械学習などのさまざまなアプリケーションに適しています。

PHPは1994年に発信され、Rasmuslerdorfによって開発されました。もともとはウェブサイトの訪問者を追跡するために使用され、サーバー側のスクリプト言語に徐々に進化し、Web開発で広く使用されていました。 Pythonは、1980年代後半にGuidovan Rossumによって開発され、1991年に最初にリリースされました。コードの読みやすさとシンプルさを強調し、科学的コンピューティング、データ分析、その他の分野に適しています。

PHPはWeb開発と迅速なプロトタイピングに適しており、Pythonはデータサイエンスと機械学習に適しています。 1.PHPは、単純な構文と迅速な開発に適した動的なWeb開発に使用されます。 2。Pythonには簡潔な構文があり、複数のフィールドに適しており、強力なライブラリエコシステムがあります。

PHPは、多数のWebサイトとアプリケーションをサポートし、フレームワークを通じて開発ニーズに適応するため、近代化プロセスで依然として重要です。 1.PHP7はパフォーマンスを向上させ、新機能を紹介します。 2。Laravel、Symfony、Codeigniterなどの最新のフレームワークは、開発を簡素化し、コードの品質を向上させます。 3.パフォーマンスの最適化とベストプラクティスは、アプリケーションの効率をさらに改善します。

phphassiblasifly-impactedwebdevevermentandsbeyondit.1)itpowersmajorplatformslikewordpratsandexcelsindatabase interactions.2)php'sadaptableability allowsitale forlargeapplicationsusingframeworkslikelavel.3)

PHPタイプは、コードの品質と読みやすさを向上させるためのプロンプトがあります。 1)スカラータイプのヒント:php7.0であるため、基本データ型は、int、floatなどの関数パラメーターで指定できます。 3)ユニオンタイプのプロンプト:PHP8.0であるため、関数パラメーターまたは戻り値で複数のタイプを指定することができます。 4)Nullable Typeプロンプト:null値を含めることができ、null値を返す可能性のある機能を処理できます。


ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

MantisBT
Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

SAP NetWeaver Server Adapter for Eclipse
Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

MinGW - Minimalist GNU for Windows
このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

PhpStorm Mac バージョン
最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

AtomエディタMac版ダウンロード
最も人気のあるオープンソースエディター
