douyin_payment_example.php 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. <?php
  2. /**
  3. * 抖音小程序支付使用示例(基于 Yansongda\Pay 包)
  4. *
  5. * 前端平台标识:douyin_mini_program
  6. * 支付方式:douyin
  7. */
  8. // 引入必要的类
  9. use app\common\Service\Pay\PayService;
  10. use app\common\Enum\ChannelEnum;
  11. // 1. 前端调用示例 (JavaScript)
  12. ?>
  13. <script>
  14. // 前端小程序调用示例
  15. const paymentData = {
  16. orderId: '123456', // 订单ID
  17. payment: 'douyin', // 支付方式
  18. openid: 'douyin_openid_xxx', // 抖音用户openid(必需)
  19. money: 0 // 额外支付金额(通常为0)
  20. };
  21. // 请求头
  22. const headers = {
  23. 'platform': 'DouyinMiniProgram', // 平台标识
  24. 'channel': 'douyin_mini_program' // 渠道标识
  25. };
  26. // 发起支付请求
  27. fetch('/api/pay/prepay', {
  28. method: 'POST',
  29. headers: {
  30. 'Content-Type': 'application/json',
  31. 'platform': 'DouyinMiniProgram'
  32. },
  33. body: JSON.stringify(paymentData)
  34. })
  35. .then(response => response.json())
  36. .then(data => {
  37. if (data.code === 1) {
  38. // 调用抖音支付
  39. const payData = data.data.pay_data;
  40. tt.requestPayment({
  41. orderInfo: payData.order_token, // 或者 payData.data.order_token
  42. success: function(res) {
  43. console.log('支付成功', res);
  44. // 跳转到成功页面
  45. },
  46. fail: function(err) {
  47. console.log('支付失败', err);
  48. // 处理支付失败
  49. }
  50. });
  51. } else {
  52. console.error('预支付失败', data.msg);
  53. }
  54. });
  55. </script>
  56. <?php
  57. // 2. 后端PayService配置示例
  58. $config = [
  59. 'app_id' => 'tt07e3715e98c9aac0', // 抖音小程序 APPID
  60. 'secret' => 'your_secret_key', // 抖音支付密钥(盐值)
  61. 'sandbox' => false, // 是否沙盒环境
  62. 'notify_url' => 'https://your-domain.com/api/pay/notify', // 支付回调地址
  63. ];
  64. // 3. 创建抖音支付实例
  65. $platform = 'DouyinMiniProgram'; // 平台标识
  66. $channel = ChannelEnum::CHANNEL_DOUYIN_MINI_PROGRAM; // 'douyin_mini_program'
  67. $payService = new PayService('douyin', $platform, $channel);
  68. // 4. 支付订单数据示例
  69. $orderData = [
  70. 'out_trade_no' => 'P202312150001', // 商户订单号
  71. 'total_amount' => 100, // 支付金额(分)
  72. 'subject' => '商城订单支付', // 订单标题
  73. 'body' => '购买商品A', // 订单描述
  74. 'cp_extra' => 'extra_data', // 开发者自定义字段(可选)
  75. ];
  76. try {
  77. // 发起支付
  78. $result = $payService->pay($orderData, $config);
  79. // $result 是 Yansongda\Supports\Collection 对象
  80. echo "支付请求成功:\n";
  81. echo "order_token: " . $result['order_token'] . "\n";
  82. echo "order_id: " . $result['order_id'] . "\n";
  83. } catch (\Exception $e) {
  84. echo "支付失败: " . $e->getMessage() . "\n";
  85. }
  86. // 5. 支付回调处理示例
  87. class PayNotifyController
  88. {
  89. public function douyinNotify()
  90. {
  91. $payService = new PayService('douyin');
  92. return $payService->notify(function($data, $originData) {
  93. // $data 是格式化后的回调数据
  94. // $originData 是原始回调数据
  95. echo "支付成功回调:\n";
  96. echo "商户订单号: " . $data['out_trade_no'] . "\n";
  97. echo "抖音订单号: " . $data['transaction_id'] . "\n";
  98. echo "支付金额: " . $data['pay_fee'] . "分\n";
  99. echo "用户信息: " . $data['buyer_info'] . "\n";
  100. // 这里处理你的业务逻辑
  101. // 1. 验证订单
  102. // 2. 更新订单状态
  103. // 3. 发送通知等
  104. // 返回成功响应给抖音
  105. return 'success';
  106. });
  107. }
  108. }
  109. // 6. 退款示例
  110. $refundData = [
  111. 'out_trade_no' => 'P202312150001', // 原订单号
  112. 'out_refund_no' => 'R202312150001', // 退款单号
  113. 'refund_amount' => 50, // 退款金额(分)
  114. 'reason' => '用户申请退款', // 退款原因
  115. ];
  116. try {
  117. $refundResult = $payService->refund($refundData, $config);
  118. echo "退款申请成功:\n";
  119. print_r($refundResult->toArray());
  120. } catch (\Exception $e) {
  121. echo "退款失败: " . $e->getMessage() . "\n";
  122. }
  123. /**
  124. * 重要配置说明:
  125. *
  126. * 1. 抖音支付配置文件位置:
  127. * application/extra/pay.php 或相关配置文件中添加:
  128. *
  129. * 'douyin' => [
  130. * 'default' => [
  131. * 'app_id' => 'tt07e3715e98c9aac0',
  132. * 'secret' => 'your_secret_key',
  133. * 'mode' => \Yansongda\Pay\Pay::MODE_NORMAL, // 或 MODE_SANDBOX
  134. * 'notify_url' => 'https://your-domain.com/api/pay/notify/douyin',
  135. * ]
  136. * ]
  137. *
  138. * 2. 平台和渠道映射:
  139. * - 前端传入:platform = 'DouyinMiniProgram'
  140. * - 渠道标识:channel = 'douyin_mini_program'
  141. * - 支付方式:payment = 'douyin'
  142. *
  143. * 3. 金额单位:
  144. * - 抖音支付使用"分"作为金额单位
  145. * - 传入金额时需要乘以100(1元 = 100分)
  146. *
  147. * 4. openid 获取:
  148. * - 抖音小程序支付需要用户的openid
  149. * - 通过抖音小程序API获取用户openid后传给后端
  150. *
  151. * 5. 回调处理:
  152. * - 支付成功回调:/api/pay/notify/payment/douyin
  153. * - 退款成功回调:/api/pay/notifyRefund/payment/douyin
  154. */