crmeb多門店對接拉卡拉支付小程序聚合收銀臺集成全流程詳解

一、商戶注冊與配置

  1. ??注冊支付平臺賬號??:在拉卡拉開放平臺注冊商戶賬號(私信聯系注冊)
  2. ??創建應用??:獲取小程序應用ID(AppID)
  3. ??配置支付參數??:
    • 商戶號(MID)
    • 終端號(TID)
    • API密鑰
    • 支付回調地址

二、配置拉卡拉參數(后臺)

app/admin/controller/system/config/PayConfig.php中添加:

// 文件路徑:app/admin/controller/system/config/PayConfig.phppublic function index()
{//...已有代碼...$list = [// 添加拉卡拉支付配置['menu_name' => '拉卡拉支付','config' => [// 商戶編號['type'      => 'text','name'      => 'lakala_merchant_id','title'     => '商戶號(MID)',],// 終端號['type'      => 'text','name'      => 'lakala_terminal_id','title'     => '終端號(TID)',],// API密鑰['type'      => 'text','name'      => 'lakala_api_key','title'     => 'API密鑰',],// 應用ID(小程序)['type'      => 'text','name'      => 'lakala_app_id','title'     => '小程序AppID',],// 是否啟用['type'      => 'radio','name'      => 'lakala_status','title'     => '啟用狀態','value'     => 0,'options'   => [['label' => '關閉', 'value' => 0],['label' => '開啟', 'value' => 1]]]]]];//...后續代碼...
}

三、支付服務層(核心)

// 文件路徑:app/services/pay/LakalaPayService.php<?php
namespace app\services\pay;use think\facade\Config;
use app\services\BaseServices;
use app\services\order\StoreOrderServices;class LakalaPayService extends BaseServices
{protected $apiUrl = 'https://api.lakala.com/payment/gateway'; // 正式環境// protected $apiUrl = 'https://test.api.lakala.com/payment/gateway'; // 測試環境// 小程序支付下單public function miniPay($order){$config = $this->getConfig();if (!$config['status']) throw new \Exception('拉卡拉支付未開啟');$params = ['version'       => '1.0','merchant_id'   => $config['merchant_id'],'terminal_id'   => $config['terminal_id'],'biz_type'      => 'MINIPRO','trade_type'    => 'JSAPI','notify_url'    => sys_config('site_url') . '/api/pay/lakala/notify','out_trade_no'  => $order['order_id'],'total_fee'     => bcmul($order['pay_price'], 100), // 轉為分'body'          => '訂單支付','sub_appid'     => $config['app_id'],'sub_openid'    => $order['openid'], // 小程序用戶openid'attach'        => 'store_id:' . $order['store_id'] // 多門店標識];// 生成簽名$params['sign'] = $this->generateSign($params, $config['api_key']);// 請求拉卡拉接口$result = $this->curlPost($this->apiUrl, $params);if ($result['return_code'] != 'SUCCESS') {throw new \Exception('拉卡拉支付請求失敗: ' . $result['return_msg']);}// 返回小程序支付參數return ['appId'     => $config['app_id'],'package'   => 'prepay_id=' . $result['prepay_id'],'timeStamp' => (string) time(),'nonceStr'  => get_nonce(16),'signType'  => 'MD5','paySign'   => $this->generateJsSign($result, $config['api_key'])];}// 生成支付簽名private function generateSign($data, $key){ksort($data);$string = '';foreach ($data as $k => $v) {if ($v === '' || $k == 'sign') continue;$string .= $k . '=' . $v . '&';}$string .= 'key=' . $key;return strtoupper(md5($string));}// 生成JS支付簽名private function generateJsSign($result, $key){$data = ['appId'     => $result['appid'],'timeStamp' => (string) time(),'nonceStr'  => get_nonce(16),'package'   => 'prepay_id=' . $result['prepay_id'],'signType'  => 'MD5'];ksort($data);$string = implode('&', array_map(function($k, $v) {return "$k=$v";}, array_keys($data), $data));$string .= '&key=' . $key;return strtoupper(md5($string));}// 處理支付回調public function handleNotify(){$xml = file_get_contents('php://input');$data = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);// 驗證簽名$sign = $data['sign'];unset($data['sign']);if ($sign != $this->generateSign($data, config('pay.lakala_api_key'))) {return false;}// 獲取門店ID$attach = explode(':', $data['attach']);$storeId = isset($attach[1]) ? intval($attach[1]) : 0;/** @var StoreOrderServices $orderService */$orderService = app()->make(StoreOrderServices::class);return $orderService->successPay($data['out_trade_no'], ['pay_type'  => 'lakala','store_id'  => $storeId]);}// 獲取配置private function getConfig(){return ['merchant_id' => sys_config('lakala_merchant_id'),'terminal_id' => sys_config('lakala_terminal_id'),'api_key'     => sys_config('lakala_api_key'),'app_id'      => sys_config('lakala_app_id'),'status'      => sys_config('lakala_status')];}// HTTP POST請求private function curlPost($url, $data){$ch = curl_init();curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_POST, true);curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);$response = curl_exec($ch);curl_close($ch);return json_decode(json_encode(simplexml_load_string($response)), true);}
}

四、支付控制器

// 文件路徑:app/api/controller/v1/pay/PayController.phppublic function lakalaPay()
{$orderId = $this->request->param('order_id');$openid = $this->request->param('openid'); // 小程序獲取的openid// 驗證訂單$order = $this->validateOrder($orderId, $openid);try {/** @var LakalaPayService $lakala */$lakala = app()->make(LakalaPayService::class);$payment = $lakala->miniPay(['order_id'   => $orderId,'pay_price'  => $order['pay_price'],'openid'     => $openid,'store_id'   => $order['store_id']]);return $this->success(compact('payment'));} catch (\Throwable $e) {return $this->fail($e->getMessage());}
}

五、小程序端調用

// 小程序端支付調用
wx.request({url: '/api/pay/lakala',method: 'POST',data: {order_id: '訂單ID',openid: '用戶openid'},success: (res) => {const payment = res.data.payment;wx.requestPayment({appId: payment.appId,timeStamp: payment.timeStamp,nonceStr: payment.nonceStr,package: payment.package,signType: payment.signType,paySign: payment.paySign,success: () => {wx.showToast({ title: '支付成功' });},fail: (err) => {wx.showToast({ title: '支付失敗', icon: 'error' });}});}
});

六、回調路由設置

// 文件路徑:route/app.phpRoute::post('api/pay/lakala/notify', 'api/pay.Pay/lakalaNotify');

七、回調控制器

// 文件路徑:app/api/controller/pay/Pay.phppublic function lakalaNotify()
{/** @var LakalaPayService $lakala */$lakala = app()->make(LakalaPayService::class);try {$result = $lakala->handleNotify();if ($result) {return response('<xml><return_code>SUCCESS</return_code></xml>', 200, [], 'xml');}} catch (\Throwable $e) {Log::error('拉卡拉回調異常:' . $e->getMessage());}return response('<xml><return_code>FAIL</return_code></xml>', 200, [], 'xml');
}

配置注意事項:

  1. ??拉卡拉參數??:在后臺系統中配置商戶號、終端號、API密鑰和小程序AppID
  2. ??商戶證書??:如需雙向驗證,需在CURL請求中添加證書配置
  3. ??多門店處理??:
    • 支付請求中附加store_id參數
    • 回調中解析門店ID并更新對應門店訂單
  4. ??跨域問題??:確保API路由支持小程序跨域請求

簽名驗證流程:

  1. 所有參數按參數名ASCII碼升序排序
  2. 使用URL鍵值對格式拼接參數
  3. 拼接API密鑰(&key=XXX
  4. 對結果進行MD5簽名(轉大寫)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/88818.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/88818.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/88818.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C#將樹圖節點展示到NetronLight圖表中

之前寫過NetronLight開源框架 C#使用開源框架NetronLight繪制流程圖-CSDN博客 我們這里將TreeView樹圖的節點內容展示到NetronLight圖表中&#xff0c;按照樹的層次【深度Level】展示 新建窗體應用程序ShowTreeNodeToDiagram&#xff0c;將默認的Form1重命名為FormShowNode&…

精密模具大深徑比微孔尺寸檢測方案 —— 激光頻率梳 3D 輪廓檢測

引言精密模具中大深徑比微孔&#xff08;深徑比&#xff1e;20:1&#xff0c;孔徑&#xff1c;1mm&#xff09;的尺寸精度直接影響注塑件、電子元件等產品的成型質量。此類微孔具有孔徑小、深度大、表面質量要求高&#xff08;Ra≤0.1μm&#xff09;等特點&#xff0c;傳統檢測…

defer學習指南

一、源頭&#xff1a;早期管理資源&#xff08;如數據庫連接、鎖、文件句柄、網絡連接&#xff09;和狀態清理異常麻煩。 必須在每個可能的返回點&#xff08;return、err、panic&#xff09;手動重復清理代碼&#xff0c;極易遺漏且打斷主要邏輯思路&#xff01;像Java語言雖然…

NLP_知識圖譜_大模型——個人學習記錄

1. 自然語言處理、知識圖譜、對話系統三大技術研究與應用 https://github.com/lihanghang/NLP-Knowledge-Graph 深度學習-自然語言處理(NLP)-知識圖譜&#xff1a;知識圖譜構建流程【本體構建、知識抽取&#xff08;實體抽取、 關系抽取、屬性抽取&#xff09;、知識表示、知…

linux:進程詳解(1)

目錄 ?編輯 1.進程基本概念與基本操作 1.1 概念 1.2 描述進程-PCB 1.2.1PCB的基本概念 1.2.2 task_ struct 1.2.3 查看進程 2.進程狀態 2.1 Linux內核源碼展示 2.2 進程狀態查看 ?編輯 2.3 Z(zombie)-僵?進程 2.4 僵尸進程的危害 2.5 孤兒進程 3.進程優先級 …

碳中和目標下的全球產業鏈重構:深度解析與未來路徑

引言&#xff1a;氣候臨界點與產業鏈的系統性風險2023年&#xff0c;全球平均氣溫較工業化前上升1.2℃&#xff0c;南極冰蓋年消融量達1500億噸&#xff0c;極端天氣事件導致的經濟損失占全球GDP的2.3%。這一系列數據背后&#xff0c;暴露出傳統產業鏈的致命缺陷——其設計邏輯…

FPGA實現SDI轉LVDS視頻發送,基于GTX+OSERDES2原語架構,提供2套工程源碼和技術支持

目錄 1、前言工程概述免責聲明 2、相關方案推薦我已有的所有工程源碼總目錄----方便你快速找到自己喜歡的項目本博已有的 SDI 編解碼方案FPGA實現LVDS視頻收發方案 3、工程詳細設計方案工程設計原理框圖SDI 輸入設備Gv8601a 均衡器GTX 解串SMPTE SD/HD/3G SDI IP核BT1120轉RGB奇…

新手向:使用Python構建高效的日志處理系統

本文將詳細講解如何使用Python開發一個專業的日志分析工具&#xff0c;能夠自動化處理、分析和可視化各類日志文件&#xff0c;大幅提升運維效率。環境準備開發本工具需要以下環境配置&#xff1a;Python環境&#xff1a;建議Python 3.8或更高版本必要庫&#xff1a;pandas&…

大模型-量化技術

簡介 模型量化是一種重要的模型壓縮技術。其核心目標是在可控精度損失下&#xff0c;將大模型中浮點型權重&#xff08;通常為 float32 等高精度格式&#xff09;近似轉換為低精度離散值表示&#xff08;通常為 int8&#xff09;。 具體而言&#xff0c;該技術通過將模型的權重…

【C語言網絡編程】HTTP 客戶端請求(域名解析過程)

在做 C 語言網絡編程或模擬 HTTP 客戶端時&#xff0c;第一步就離不開“把域名解析為 IP 地址”這一步。很多人可能直接復制粘貼一段 gethostbyname 的代碼&#xff0c;但未必真正理解它的原理。 本篇博客將圍繞一個經典函數&#xff1a; char *host_to_ip(const char *hostna…

Node.js特訓專欄-實戰進階:16. RBAC權限模型設計

?? 歡迎來到 Node.js 實戰專欄!在這里,每一行代碼都是解鎖高性能應用的鑰匙,讓我們一起開啟 Node.js 的奇妙開發之旅! Node.js 特訓專欄主頁 專欄內容規劃詳情 我將從RBAC權限模型的基礎概念、核心組件講起,詳細闡述其設計原則、數據庫模型設計,還會結合代碼示例展示在…

mac上BRPC的CMakeLists.txt優化:解決Protobuf路徑問題

問題背景與挑戰 在構建高性能RPC框架BRPC時&#xff0c;?Protobuf依賴路徑的配置往往是開發者面臨的主要挑戰之一。原始CMake配置在尋找Protobuf庫時存在以下痛點&#xff1a; ?路徑搜索不精確?&#xff1a;默認find_library無法定位自定義安裝路徑下的Protobuf?版本兼容…

Go 性能分析利器:pprof 工具實戰指南

在 Go 語言開發中&#xff0c;性能問題往往是項目上線后最棘手的挑戰之一。無論是 CPU 占用過高、內存泄漏&#xff0c;還是 goroutine 失控&#xff0c;都可能導致服務響應緩慢甚至崩潰。而pprof作為 Go 官方提供的性能分析工具&#xff0c;就像一把精準的手術刀&#xff0c;能…

fio測試SSD直接I/O(Direct IO)性能僅有100MB/s的問題解決

針對您使用fio測試SSD直接I/O&#xff08;Direct IO&#xff09;性能僅有100MB/s的問題&#xff0c;結合SSD特性和fio測試原理 fio測試SSD直接I/O&#xff08;Direct IO&#xff09;性能僅有100MB/s的問題 - LinuxGuideLinuxGuide 以下是可能的原因及優化方案&#xff1a; &a…

EVO-0:具有隱空間理解的視覺-語言-動作模型

25年6月來自上海交大、EvoMind Tech 和上海算法創新研究院&#xff08;IAAR-Shanghai&#xff09;的論文“EVO-0: Vision-Language-Action Model with Implicit Spatial Understanding”。 視覺-語言-動作 (VLA) 模型已成為一種有前途的框架&#xff0c;可使通用機器人能夠在現…

文心大模型4.5開源測評:輕量化部署實踐與多維度能力驗證

前言&#xff1a;開源浪潮下的輕量化革命 2025年百度文心大模型4.5系列的開源&#xff0c;標志著國產大模型從“參數競賽”轉向“實用落地”的關鍵轉折。當行業仍在追逐千億參數模型時&#xff0c;文心4.5以0.3B輕量級模型撕開一條新賽道——單卡部署、低成本運維、中文場景高…

LeetCode 2401.最長優雅子數組

給你一個由 正 整數組成的數組 nums 。 如果 nums 的子數組中位于 不同 位置的每對元素按位 與&#xff08;AND&#xff09;運算的結果等于 0 &#xff0c;則稱該子數組為 優雅 子數組。 返回 最長 的優雅子數組的長度。 子數組 是數組中的一個 連續 部分。 注意&#xff1a;長…

中華心法問答系統的解讀(1)

中華心法問答系統一、研究背景1. 研究意義2. 研究目的3. 信息檢索技術二、主要研究內容三、相關技術介紹1. Flask框架技術2. BERT模型&#xff08;1&#xff09;基本概念&#xff08;2&#xff09;BERT解決的問題&#xff08;3&#xff09;BERT的核心結構a. 模型結構b. 預訓練任…

Java 大視界 -- Java 大數據在智能安防視頻監控系統中的視頻摘要快速生成與檢索優化(345)

Java 大視界 -- Java 大數據在智能安防視頻監控系統中的視頻摘要快速生成與檢索優化&#xff08;345&#xff09;引言&#xff1a;正文&#xff1a;一、Java 構建的全場景視頻處理系統&#xff08;含校園 / 工廠 / 礦區適配&#xff09;1.1 校園宿舍區夜間檢索方案&#xff08;…

信號量機制,互斥的避免自旋鎖的實現方法(操作系統)

這次的比喻場景要升級了&#xff0c;因為它既能解決互斥問題&#xff0c;也能解決同步問題。我們用一個更綜合的場景&#xff1a;一個擁有多輛共享單車的站點。共享單車 (資源)&#xff1a;站點里有多輛共享單車&#xff0c;數量是有限的。你 (進程)&#xff1a;想借一輛車去辦…