• 在 PHP 中实现 LINE Pay API 之前我应该​​做哪些准备?
  • 如何在 PHP 中实现 LINE Pay API?

目录

  1. [前提] 环境
  2. 使用 PHP 实现 LINE Pay API 的准备工作
  3. 使用 PHP 实现 LINE Pay API
  4. 概括   

[前提] 环境

这次我们将使用SandBox环境(测试环境) 。

我们将实现RequestAPI的执行。

使用 PHP 实现 LINE Pay API 的准备工作

我们将解释在 PHP 中实现 LINE Pay API 所需的前期准备工作。

沙盒生成

创建一个沙盒。

一旦生成,一封电子邮件将发送到您的电子邮件地址。

登录LINE Pay我的页面

点击并登录。

您的登录详细信息将在您之前收到的电子邮件中提供。

链接密钥管理
登录后,进入“ 支付链接管理”⇒“ 链接密钥管理”,输入您的密码(您登录时使用的密码),点击 确认。
链接密钥管理参考
记下 频道 ID频道密钥。
PHP 实现 INE ay API

在 PHP 中实现 LINE Pay API。

<?php
// 设置频道ID,用于标识API请求的来源
$channel_id = '您的频道ID';// 设置秘密钥匙,用于生成请求签名
$channel_secret_key = '你的秘密钥匙';// 设置Line支付API的URL(沙盒环境),用于测试
$line_url = 'https://sandbox-api-pay.line.me';
// 如果是生产环境,可以将URL更改为实际生产环境的URL
// $line_url = 'https://api-pay.line.me';// 定义请求路径,这里指的是创建支付请求的API路径
$path = '/v3/payments/request';// 生成一个唯一的UUID,用于标识当前请求
$nonce = gen_uuid();// 构造请求体,这里用JSON格式定义了支付请求的相关信息
$body = json_encode(array("amount" => 1,  // 支付金额,单位是日元(JPY)"currency" => "JPY",  // 货币类型,这里使用的是日元"orderId" => "testOrderId",  // 订单ID,用于标识当前的支付订单"packages" => array(array(  // 商品包信息"id" => "testPackages1",  // 商品包的ID'name'   => "packages",  // 商品包的名称"amount" => 1,  // 商品包的金额"products" => array(array(  // 商品详细信息"id" => "testProducts1",  // 商品ID"name" => "products",  // 商品名称"quantity" => 1,  // 商品数量"price" => 1  // 商品单价)))),"redirectUrls" => array(  // 用户支付完成后需要重定向的URL"confirmUrl" => "https://myPage",  // 支付完成后的确认URL"cancelUrl" => "https://myPage"   // 支付取消后的URL)
));// 输出请求体内容,便于调试时查看生成的JSON数据
echo $body;// 生成请求签名,使用HMAC SHA-256算法
// 签名的生成规则:签名 = base64(HMAC-SHA256(频道密钥 + 请求路径 + 请求体 + UUID, 频道密钥))
$signature = base64_encode(hash_hmac('sha256', $channel_secret_key . $path . $body . $nonce, $channel_secret_key, true));// 设置HTTP请求头,包含必要的认证信息
$header = array('Content-Type:'               . 'application/json',  // 请求内容类型,设置为JSON格式'X-LINE-ChannelId:'           . $channel_id,         // 频道ID,用于标识发送请求的渠道'X-LINE-Authorization-Nonce:' . $nonce,              // 使用的UUID,防止重放攻击'X-LINE-Authorization:'       . $signature           // 请求签名,用于验证请求的合法性
);/************************************************************ 执行API请求***********************************************************/// 初始化cURL会话
$curl = curl_init();// 设置cURL选项
curl_setopt($curl, CURLOPT_URL,            $line_url . $path);  // 设置请求的URL
curl_setopt($curl, CURLOPT_HTTPHEADER,     $header);            // 设置请求头
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);              // 将返回结果以字符串形式输出
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);                 // 禁用SSL验证(用于开发环境,生产环境请开启)
curl_setopt($curl, CURLOPT_POST,           true);              // 设置为POST请求
curl_setopt($curl, CURLOPT_POSTFIELDS,     $body);             // 设置请求体内容// 执行cURL请求并获取返回结果
$result = curl_exec($curl);// 关闭cURL会话
curl_close($curl);// 输出API请求的响应结果
echo $result;// 生成UUID函数,用于创建唯一的标识符
function gen_uuid()
{return sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x',  // 按照特定格式生成UUIDmt_rand(0, 0xffff),   // 生成一个随机的16位数mt_rand(0, 0xffff),mt_rand(0, 0xffff),mt_rand(0, 0x0fff) | 0x4000,  // 确保UUID符合UUIDv4格式mt_rand(0, 0x3fff) | 0x8000,mt_rand(0, 0xffff),mt_rand(0, 0xffff),mt_rand(0, 0xffff));
}
?>

运行上述内容。

{"returnCode": "0000","returnMessage": "Success.","info": {"paymentUrl": {"web": "https://sandbox-web-pay.line.me/web/payment/wait?transactionReserveId=hoge...","app": "linesandbox://pay/payment/hoge..."},"transactionId": 2020122500646238200,"paymentAccessToken": "911163781279"}
}

如果返回如上这样的JSON那就没问题了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/82912.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/82912.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/82912.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

centos7.x下,使用宝塔进行主从复制的原理和实践

操作原理&#xff1a; 一、主库配置 1.修改 MySQL 配置文件 # 编辑主库配置文件&#xff08;路径根据实际系统可能不同&#xff09; vim /etc/my.cnf # 添加以下配置 [mysqld] server-id 1 # 唯一 ID&#xff0c;主库设置为 1 log-bin mysql-bin …

从零实现基于Transformer的英译汉任务

1. model.py&#xff08;用的是上一篇文章的代码&#xff1a;从0搭建Transformer-CSDN博客&#xff09; import torch import torch.nn as nn import mathclass PositionalEncoding(nn.Module):def __init__ (self, d_model, dropout, max_len5000):super(PositionalEncoding,…

c#建筑行业财务流水账系统软件可上传记账凭证财务管理系统签核功能

# financial_建筑行业 建筑行业财务流水账系统软件可上传记账凭证财务管理系统签核功能 # 开发背景 软件是给岳阳客户定制开发一款建筑行业流水账财务软件。提供工程签证单、施工日志、人员出勤表等信息记录。 # 财务管理系统功能描述 1.可以自行设置记账科目&#xff0c;做凭…

MySQL 8.0 OCP 1Z0-908 题目解析(2)

题目005 Choose two. Which two actions can obtain information about deadlocks? □ A) Run the SHOW ENGINE INNODB MUTEX command from the mysql client. □ B) Enable the innodb_status_output_locks global parameter. □ C) Enable the innodb_print_all_deadlock…

XA协议和Tcc

基于 XA 协议的两阶段提交 (2PC)。这是一种分布式事务协议&#xff0c;旨在保证在多个参与者&#xff08;通常是不同的数据库或资源管理器&#xff09;共同参与的事务中&#xff0c;所有参与者要么都提交事务&#xff0c;要么都回滚事务&#xff0c;从而维护数据的一致性。 你…

数据分析-图2-图像对象设置参数与子图

from matplotlib import pyplot as mp mp.figure(A figure,facecolorgray) mp.plot([0,1],[1,2]) mp.figure(B figure,facecolorlightgray) mp.plot([1,2],[2,1]) #如果figure中标题已创建&#xff0c;则不会新建窗口&#xff0c; #而是将旧窗口设置为当前窗口 mp.figure(A fig…

跳转语句:break、continue、goto -《Go语言实战指南》

在控制流程中&#xff0c;我们有时需要跳出当前循环或跳过当前步骤&#xff0c;甚至直接跳转到指定位置。Go 提供了三种基本跳转语句&#xff1a; • break&#xff1a;跳出当前 for、switch 或 select。• continue&#xff1a;跳过本轮循环&#xff0c;进入下一轮。• goto&a…

Linux中find命令用法核心要点提炼

大家好&#xff0c;欢迎来到程序视点&#xff01;我是你们的老朋友.小二&#xff01; 以下是针对Linux中find命令用法的核心要点提炼&#xff1a; 基础语法结构 find [路径] [选项] [操作]路径&#xff1a;查找目录&#xff08;.表当前目录&#xff0c;/表根目录&#xff09;…

MQTT协议详解:物联网通信的轻量级解决方案

MQTT协议详解&#xff1a;物联网通信的轻量级解决方案 引言 在物联网(IoT)快速发展的今天&#xff0c;设备间高效可靠的通信变得至关重要。MQTT(Message Queuing Telemetry Transport)作为一种轻量级的发布/订阅协议&#xff0c;已成为物联网通信的首选解决方案。本文将深入探…

list基础用法

list基础用法 1.list的访问就不能用下标[]了,用迭代器2.emplace_back()几乎是与push_back()用法一致&#xff0c;但也有差别3.insert(),erase()的用法4.reverse()5.排序6.合并7.unique()&#xff08;去重&#xff09;8.splice剪切再粘贴 1.list的访问就不能用下标[]了,用迭代器…

2025年第十六届蓝桥杯大赛软件赛C/C++大学B组题解

第十六届蓝桥杯大赛软件赛C/C大学B组题解 试题A: 移动距离 问题描述 小明初始在二维平面的原点&#xff0c;他想前往坐标(233,666)。在移动过程中&#xff0c;他只能采用以下两种移动方式&#xff0c;并且这两种移动方式可以交替、不限次数地使用&#xff1a; 水平向右移动…

BGP实验练习2

需求&#xff1a; 1.AS1存在两个环回&#xff0c;一个地址为192.168.1.0/24&#xff0c;该地址不能再任何协议中宣告 AS3存在两个环回&#xff0c;该地址不能再任何协议中宣告 AS1还有一个环回地址为10.1.1.0/24&#xff0c;AS3另一个环回地址是11.1.1.0/24 最终要求这两…

【温湿度物联网】记录1:寄存器配置

一&#xff0c;及哦地址 基地址base的定义&#xff1a; ↓ 定义完是这个&#xff1a; GPIOA的地址就是以上的代表 2寄存器&#xff1a; 通过bsrr来改变odr寄存器&#xff0c;左移16位就是把0-15位的给移到高位的保留区&#xff0c;这样就归零了 3&#xff0c;项目寄存器实操…

MCP项目实例 - client sever交互

1. 项目概述 项目目标 构建一个本地智能舆论分析系统。 利用自然语言处理和多工具协作&#xff0c;实现用户查询意图的自动理解。 进行新闻检索、情绪分析、结构化输出和邮件推送。 系统流程 用户查询&#xff1a;用户输入查询请求。 提取关键词&#xff1a;从用户查询中…

运维体系架构规划

运维体系架构规划是一个系统性工程&#xff0c;旨在构建高效、稳定、安全的运维体系&#xff0c;保障业务系统的持续运行。下面从规划目标、核心模块、实施步骤等方面进行详细阐述&#xff1a; 一、规划目标 高可用性&#xff1a;确保业务系统 724 小时不间断运行&#xff0c…

zst-2001 上午题-历年真题 计算机网络(16个内容)

网络设备 计算机网络 - 第1题 ac 计算机网络 - 第2题 d 计算机网络 - 第3题 集线器不能隔离广播域和冲突域&#xff0c;所以集线器就1个广播域和冲突域 交换机就是那么的炫&#xff0c;可以隔离冲突域&#xff0c;有4给冲突域&#xff0c;但不能隔离广播域&#xf…

Python之with语句

文章目录 Python中的with语句详解一、基本语法二、工作原理三、文件操作中的with语句1. 基本用法2. 同时打开多个文件 四、with语句的优势五、自定义上下文管理器1. 基于类的实现2. 使用contextlib模块 六、常见应用场景七、注意事项 Python中的with语句详解 with语句是Python…

我的五周年创作纪念日

五年前的今天&#xff0c;我在CSDN发布了第一篇《基于VS2015的MFC学习笔记&#xff08;常用按钮button&#xff09;》&#xff0c;文末那句"欢迎交流"的忐忑留言&#xff0c;开启了这段充满惊喜的技术旅程。恍然发觉那些敲过的代码早已成长为参天大树。 收获 获得了…

Realtek 8126驱动分析第四篇——multi queue相关

Realtek 8126是 5G 网卡&#xff0c;因为和 8125 较为接近&#xff0c;第四篇从这里开始也无不可。本篇主要是讲 multi queue 相关&#xff0c;其他的一些内容在之前就已经提过&#xff0c;不加赘述。 1 初始化 1.1 rtl8126_init_one 从第一篇我们可以知道每个 PCI 驱动都注…

使用PHP对接日本股票市场数据

本文将介绍如何通过StockTV提供的API接口&#xff0c;使用PHP语言来获取并处理日本股票市场的数据。我们将以查询公司信息、查看涨跌排行榜和实时接收数据为例&#xff0c;展示具体的操作流程。 准备工作 首先&#xff0c;请确保您已经从StockTV获得了API密钥&#xff0c;并且…