123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174 |
- <?php
- /**
- * 抖音小程序支付使用示例(基于 Yansongda\Pay 包)
- *
- * 前端平台标识:douyin_mini_program
- * 支付方式:douyin
- */
- // 引入必要的类
- use app\common\Service\Pay\PayService;
- use app\common\Enum\ChannelEnum;
- // 1. 前端调用示例 (JavaScript)
- ?>
- <script>
- // 前端小程序调用示例
- const paymentData = {
- orderId: '123456', // 订单ID
- payment: 'douyin', // 支付方式
- openid: 'douyin_openid_xxx', // 抖音用户openid(必需)
- money: 0 // 额外支付金额(通常为0)
- };
- // 请求头
- const headers = {
- 'platform': 'DouyinMiniProgram', // 平台标识
- 'channel': 'douyin_mini_program' // 渠道标识
- };
- // 发起支付请求
- fetch('/api/pay/prepay', {
- method: 'POST',
- headers: {
- 'Content-Type': 'application/json',
- 'platform': 'DouyinMiniProgram'
- },
- body: JSON.stringify(paymentData)
- })
- .then(response => response.json())
- .then(data => {
- if (data.code === 1) {
- // 调用抖音支付
- const payData = data.data.pay_data;
-
- tt.requestPayment({
- orderInfo: payData.order_token, // 或者 payData.data.order_token
- success: function(res) {
- console.log('支付成功', res);
- // 跳转到成功页面
- },
- fail: function(err) {
- console.log('支付失败', err);
- // 处理支付失败
- }
- });
- } else {
- console.error('预支付失败', data.msg);
- }
- });
- </script>
- <?php
- // 2. 后端PayService配置示例
- $config = [
- 'app_id' => 'tt07e3715e98c9aac0', // 抖音小程序 APPID
- 'secret' => 'your_secret_key', // 抖音支付密钥(盐值)
- 'sandbox' => false, // 是否沙盒环境
- 'notify_url' => 'https://your-domain.com/api/pay/notify', // 支付回调地址
- ];
- // 3. 创建抖音支付实例
- $platform = 'DouyinMiniProgram'; // 平台标识
- $channel = ChannelEnum::CHANNEL_DOUYIN_MINI_PROGRAM; // 'douyin_mini_program'
- $payService = new PayService('douyin', $platform, $channel);
- // 4. 支付订单数据示例
- $orderData = [
- 'out_trade_no' => 'P202312150001', // 商户订单号
- 'total_amount' => 100, // 支付金额(分)
- 'subject' => '商城订单支付', // 订单标题
- 'body' => '购买商品A', // 订单描述
- 'cp_extra' => 'extra_data', // 开发者自定义字段(可选)
- ];
- try {
- // 发起支付
- $result = $payService->pay($orderData, $config);
-
- // $result 是 Yansongda\Supports\Collection 对象
- echo "支付请求成功:\n";
- echo "order_token: " . $result['order_token'] . "\n";
- echo "order_id: " . $result['order_id'] . "\n";
-
- } catch (\Exception $e) {
- echo "支付失败: " . $e->getMessage() . "\n";
- }
- // 5. 支付回调处理示例
- class PayNotifyController
- {
- public function douyinNotify()
- {
- $payService = new PayService('douyin');
-
- return $payService->notify(function($data, $originData) {
- // $data 是格式化后的回调数据
- // $originData 是原始回调数据
-
- echo "支付成功回调:\n";
- echo "商户订单号: " . $data['out_trade_no'] . "\n";
- echo "抖音订单号: " . $data['transaction_id'] . "\n";
- echo "支付金额: " . $data['pay_fee'] . "分\n";
- echo "用户信息: " . $data['buyer_info'] . "\n";
-
- // 这里处理你的业务逻辑
- // 1. 验证订单
- // 2. 更新订单状态
- // 3. 发送通知等
-
- // 返回成功响应给抖音
- return 'success';
- });
- }
- }
- // 6. 退款示例
- $refundData = [
- 'out_trade_no' => 'P202312150001', // 原订单号
- 'out_refund_no' => 'R202312150001', // 退款单号
- 'refund_amount' => 50, // 退款金额(分)
- 'reason' => '用户申请退款', // 退款原因
- ];
- try {
- $refundResult = $payService->refund($refundData, $config);
- echo "退款申请成功:\n";
- print_r($refundResult->toArray());
- } catch (\Exception $e) {
- echo "退款失败: " . $e->getMessage() . "\n";
- }
- /**
- * 重要配置说明:
- *
- * 1. 抖音支付配置文件位置:
- * application/extra/pay.php 或相关配置文件中添加:
- *
- * 'douyin' => [
- * 'default' => [
- * 'app_id' => 'tt07e3715e98c9aac0',
- * 'secret' => 'your_secret_key',
- * 'mode' => \Yansongda\Pay\Pay::MODE_NORMAL, // 或 MODE_SANDBOX
- * 'notify_url' => 'https://your-domain.com/api/pay/notify/douyin',
- * ]
- * ]
- *
- * 2. 平台和渠道映射:
- * - 前端传入:platform = 'DouyinMiniProgram'
- * - 渠道标识:channel = 'douyin_mini_program'
- * - 支付方式:payment = 'douyin'
- *
- * 3. 金额单位:
- * - 抖音支付使用"分"作为金额单位
- * - 传入金额时需要乘以100(1元 = 100分)
- *
- * 4. openid 获取:
- * - 抖音小程序支付需要用户的openid
- * - 通过抖音小程序API获取用户openid后传给后端
- *
- * 5. 回调处理:
- * - 支付成功回调:/api/pay/notify/payment/douyin
- * - 退款成功回调:/api/pay/notifyRefund/payment/douyin
- */
|