当前位置: 首页 > news >正文

长沙做彩票网站公司打金新开传奇网站

长沙做彩票网站公司,打金新开传奇网站,高端网站设计企业,荆州网站建设荆州一、商户注册与配置​​注册支付平台账号​​:在拉卡拉开放平台注册商户账号(私信联系注册)​​创建应用​​:获取小程序应用ID(AppID)​​配置支付参数​​:商户号(MID)终端号(TID)API密钥支付回调地址二、配置拉卡拉…

一、商户注册与配置

  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.dtcms.com/a/558825.html

相关文章:

  • 网站根目录权限设置wordpress背景设置
  • 计算机操作系统:与设备无关的I/O软件
  • 怎么做一个公司网站广州装修公司哪家好
  • 百度网站优化升上去营销策略ppt模板
  • 仓颉语言实战:无重复字符的最长子串工具库
  • pg_stat 视图介绍
  • 游戏网站cms网站做好了前端 后端怎么做
  • 青岛住房和城乡建设厅网站个人注册域名和公司注册域名区别
  • 京东e卡 滑块分析
  • 嘉兴制作网站深圳网站建设最专业的
  • 网站打开速度慢 如何优化做网站收会员费
  • 网站制作公司网址wordpress 无刷新翻页
  • 临汾网站建设 吕梁网站建设郑州新闻最新消息
  • 网站开发学些什么软件电商平台是干什么的
  • 宜城网站定制seo推广计划
  • 合川建网站网站建设_seo技术支持
  • 广东住房和城乡建设部网站alexa排名助手
  • 做网站的电话江苏seo培训
  • 网站标签怎么做跳转重庆seo排名软件
  • 外贸网站建设制作com域名注册查询
  • 北京做网站制作的公司哪家好做商城网站公司吗
  • 苏州住房与城乡建设部网站成都网站推广经理
  • 邯郸建设网站做的比较好的车载嗨曲网站
  • QCAD,一款好用的2D CAD绘图工具
  • 广宁县住房建设局网站ui培训怎么样
  • 关于做ppt的网站有哪些内容吗dedecms织梦系统网站防会员注册机
  • 微商城和小程序区别正规seo排名外包
  • 内网穿透方案-nps
  • 青岛找网站建设公司哪家好网站建设公司哪家好?该如何选择
  • 哪个网站可以接广告做wordpress获取自定义字段值