在PHP中处理支付接口,需要使用到一些常用的技术和工具。下面我们将逐一介绍这些技术和工具。
网络请求工具——cURL在PHP中处理支付接口,需要根据实际情况选择不同的处理方案。下面介绍几种常用的支付接口处理方案。
集成支付平台官方SDK
这是最常见的一种方案,即通过集成支付平台官方提供的SDK,直接调用其API接口实现支付功能。这种方案需要开发者了解支付平台的相关API接口和技术细节,可以通过阅读官方的文档和开发指导进行学习和理解。
使用第三方支付接口集成工具
针对不同的支付平台,也有一些第三方支付接口集成工具,如支付宝开放平台、微信支付SDK等,可以方便地实现支付接口的集成和使用。这种方案需要开发者了解具体的支付平台和第三方集成工具的技术细节和使用方法,以确保支付功能的稳定和安全。
自行编写支付接口处理类
对于一些特殊的支付场景,开发者也可以自行编写支付接口处理类,实现对支付请求的处理和支付结果的回调。这种方案需要开发者了解具体的支付接口技术和编程技术,具有较高的技术难度和风险,需要进行充分的测试和验证。
综上所述,处理支付接口是网站开发中的一个非常关键的环节,需要开发者具备深入的技术和扎实的实践经验。在选择支付接口处理方案和技术工具时,需要根据实际情况进行选择和权衡,确保支付功能的稳定、安全和可用性。
以上内容转至php中文网:原文链接
(2) 生成公、私秘钥(安装和环境变量配置略)
openssl genrsa -out privatekey.pem 1024 1
openssl rsa -in privatekey.pem -pubout -out publickkey.pem 1
2. TP编写配置文件:项目目录/config/pay.php (项目目录项的config文件下创建pay.php配置文件)
<?php return [ 'bestPay'=>[ // 私钥(刚刚生成的) 'pri_key'=>'', // 公钥(刚刚生成的) 'pub_key'=>'', // 平台编号(随机唯一数字) 'merchantNo'=>'', // 小程序ID 'appId'=>'wx.........................' ] ]; 12345678910111213 预支付接口逻辑
/** * 小程序支付 */ public function pay() { // 小程序中的用户ID if (!$this->input['openId']) { $this->ApiError("openId数据错误"); } // 获取订单信息 $order = HotelOrder::where('id', '=', $this->input['id'])->find(); // 支付流水号 $order->out_trade_no = date('His') . $order['order_number']; // 保存订单流水号 $order->save(); // 支付对象工厂模式 创建bestPay翼支付对象 $payment = PayFactory::createPayMent('bestPay'); // extend 支付扩展参数 // 支付类型:订单支付 $extend['payType'] = 'payOrder'; // 支付主题 $extend['subject'] = '门店下单'; // 商品信息 $extend['goodsInfo'] = '梅菜扣肉、红烧肉'; //$extend['notifyUrl'] = thinkfacadeConfig::get('app.app_host').url('/api/Notify/pay'); // 微信支付完成后回调通知地址 $extend['notifyUrl'] = (string)Route::buildUrl('/api/Notify/pay')->domain(true); // 支付超时时间(秒) $extend['timeOut'] = 180; // 交易场景 $extend['tradeScene'] = 'ONLINE'; // 支付场景 $extend['payScene'] = 'APP'; // 交易类型 $extend['tradeType'] = 'TENPAY'; // 小程序ID $extend['appId'] = Config::get('pay.bestPay.appId'); //$extend['userCode'] = 'oh1xg5KJxeZ3pSDBYQwFYMxEIsD0'; // 小程序用户openID $extend['userCode'] = $this->input['openId']; // 请求时间 $extend['requestDate'] = date("Y-m-d H:i:s"); // fk 风险 // 服务身份识别 $fk['service_identify'] = '10000001'; $fk['subject'] = $extend['subject']; $fk['product_type'] = 1; $fk['goods_count'] = 1; $fk = array($fk); // 风险控制信息 $extend['riskControlInfo'] = json_encode($fk); // 组装支付数据,并接入翼支付接口 $res = $payment->pay($order['deal_price'] * 100, $order->out_trade_no, array_merge($this->getBestPayParams(), $extend)); //返回微信小程序支付所需数据 if ($res['success']) { //更新outTradeNo $this->ApiSuccess('执行成功', $res['data']['appMap']); } else { $this->ApiError($res['error']); } }
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 $payment->pay:支付接口逻辑class BestPay implements IPay { private $config; private const API = ""; // 翼支付接口(第三方提供 ) private const APIURL=[ '_payOrder' => self::API.'r', // 支付接口(第三方提供 ) '_refund' => self::API.'', // 退款接口(第三方提供 ) ]; /** 构造方法获取支付的参数配置 */ public function __construct() { $this->config = Config::get('pay.bestPay'); // 公钥:pub_key 、私钥:pri_key、平台编码:merchantNo、微信小程序ID:appId } /** * 魔术方法,监视该类生成对象所调用的方法,如果对象调用的方法不存在,则执行__call()方法 * @param $name 支付名称 _payOrder * @param $arguments 订单详细数据 * @return mixed|string|null * @throws Exception */ public function __call($name, $arguments) { if(array_key_exists($name,self::APIURL)){ $data = $arguments[0]; // 声明翼支付对象(该对象属性值包含:验证签名、加密方式等) $util = new PayUtil('bestPay'); // 数组key按照abc...排序 ksort($data); // 通过RSA非对称加密手段,获取签名后的数据(保证数据传输的安全性) $data['sign'] = $util->Sign($data); ksort($data); $data = json_encode($data); // 返回请求支付接口返回的数据 return $util->request(self::APIURL[$name],$data,'post'); }else{ throw new Exception("there is no method {$name} for payment".self::class); } } /** * @param int $amount 金额(分) * @param string $orderNo 支付流水号(也可以是订单号,保持唯一性即可) * @param array $extend merchantNo:平台编码,operator:支付人的微信昵称,notifyUrl:支付结果回调地址 * ,goodsInfo:商品信息,subject:主题 * ,timeOut:超时时间,mediumNo:,requestDate:请求时间 * @return mixed */ public function pay($amount, $orderNo, $extend = []) { $type = 'payOrder'; if(isset($extend['payType'])){ $type = $extend['payType']; unset($extend['payType']); } // 支付金额 $request['tradeAmt'] = $amount; // 支付流水号 $request['outTradeNo'] = $orderNo; $request = array_merge($request,$extend); // call_user_func_array: 自定义回调函数回调__call魔术方法,并把一个数组参数作为回调函数的参数。 $res = call_user_func_array(array($this, '_'.$type), [$request]); // 回调函数错误信息 $error = $res['errorMsg']??$res['result']['tradeResultDesc']; // 回调函数成功 $success = $res['success']; $data = $res['result']; $tradeNo = ''; // compact 创建一个包含变量名和它们的值的数组 return compact('success','data','error','tradeNo'); } }
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 展示接口返回数据// 发起支付submit: function() {let that = this;wx.showLoading({title: '发起支付中',})let newData = {};newData = {id: that.data.order_id, //订单idpay_type: this.data.infoObj.pay_type, //支付方式openId: wx.getStorageSync('openid')}newData = JSON.stringify(newData)util.send('/api/pay/pay', 'post', newData, function(payinfo) { // 先访问预支付接口,得到payinfo数据->微信统一下单接口wx.requestPayment({'timeStamp': payinfo.timeStamp,'nonceStr': payinfo.nonceStr,'package': payinfo.package,'signType': payinfo.signType,'paySign': payinfo.paySign,success: (res) => {// 支付成功跳转订单详情页},fail: function(res) { // 支付失败},})}, function(err) {console.log(err)wx.showToast({title: err.rtnMsg,icon: 'none'})})},
123456789101112131415161718192021222324252627282930313233343536附:统一下单接口:wx.requestPayment (下图:官方解释字段)
相关知识
对接支付宝、微信、第三方支付,超详细讲解+demo演示
微信小程序之植物识别demo(百度开发接口)
易支付搭建与接口对接完整教程:打造专属支付系统
支付设计白皮书:支付系统的总架构
设计模式(一) 支付策略模式
鲜花微信小程序系统详解与核心代码展示
微信小程序插件
去哪儿网支付系统架构演进
鲜花预定小程序源码制作开发搭建
基于微信小程序的鲜花预定系统的设计与实现
网址: 支付接口的基本定义及thinkphp6 & 微信小程序对接翼支付接口(项目实例) https://m.huajiangbk.com/newsview948963.html
上一篇: java如何调用支付接口测试 |
下一篇: springboot项目集成支付 |