• php实现抖音小程序支付


     

    开发者发起下单_小程序_抖音开放平台

    第一步、抖音小程序发起支付

    tt.pay_小程序_抖音开放平台

    前端提交订单数据到后端接口,然后使用 tt.pay发起支付

    请求参数

    属性

    类型

    必填

    说明

    order_id

    string

    担保交易服务端订单号

    order_token

    string

    担保交易订单号 token

    1. methods: {
    2. requestPayment() {
    3. tt.showLoading();
    4. getDeviceId().then(deviceId => {
    5. tt.request({
    6. url: 'https://xxx.comm',
    7. method: 'POST',
    8. header: {
    9. 'Content-Type': 'application/json',
    10. 'token': '75dda91d-cb3d-4126-8f63-decee26e9ada'
    11. },
    12. data: {
    13. amount: 1,
    14. device_id: deviceId ,
    15. sid: 8 ,
    16. uid: 1572 ,
    17. pricebuy: 1 ,
    18. lx: 2 ,
    19. priced: 1 ,
    20. sum: 1 ,
    21. buytype: '抖音' ,
    22. },
    23. success: (res) => {
    24. console.log('orderInfo是:', res.data.data);
    25. console.log('order_id:', res.data.data.order_id);
    26. console.log('order_id:', res.data.data.order_token);
    27. tt.pay({
    28. orderInfo: {
    29. order_id: res.data.data.order_id,
    30. order_token:res.data.data.order_token
    31. },
    32. service: 5,
    33. success(res) {
    34. if (res.code == 0) {
    35. // 支付成功处理逻辑,只有res.code=0时,才表示支付成功
    36. // 但是最终状态要以商户后端结果为准
    37. }
    38. },
    39. fail(res) {
    40. // 调起收银台失败处理逻辑
    41. },
    42. });
    43. tt.hideLoading();
    44. }
    45. });
    46. });
    47. }
    48. }

    第二步、后端请求抖音预支付接口

    1.使用预下单接口

    1. //amount金额 subject标题 body详情 out_trade_no订单号 notify_url回调地址
    2. public function pay($amount,$subject,$body,$out_trade_no,$notify_url)
    3. {
    4. $site=config('site');
    5. if($amount<=0){
    6. $this->error(__('金额不对'));
    7. }
    8. $amount=$amount*100;
    9. $url = 'https://developer.toutiao.com/api/apps/ecpay/v1/create_order';
    10. $data = [
    11. "app_id" => $site['douyin']['appid'],
    12. "out_order_no" =>$out_trade_no,
    13. "total_amount" => $amount,
    14. "subject" => $subject,
    15. "body" => $body,
    16. "valid_time" => 180,
    17. "cp_extra" =>$subject,
    18. "notify_url" => $notify_url
    19. ];
    20. $data['sign']= dysign($data,$site['douyin']['salt']);
    21. $res= jsonPost($url,$data);
    22. $res=json_decode($res,true);
    23. if(!is_array($res)){
    24. $this->error($res);
    25. }
    26. if($res['err_no']!=0){
    27. $this->error($res['err_tips']);
    28. }
    29. $payData=$res['data'];
    30. $this->success('订单提交成功 正在跳转支付',$payData);
    31. }

    2.支付签名 

    1. //支付签名
    2. function sign($map,$salt) {
    3. $rList = [];
    4. foreach($map as $k =>$v) {
    5. if ($k == "other_settle_params" || $k == "app_id" || $k == "sign" || $k == "thirdparty_id")
    6. continue;
    7. $value = trim(strval($v));
    8. if (is_array($v)) {
    9. $value = arrayToStr($v);
    10. }
    11. $len = strlen($value);
    12. if ($len > 1 && substr($value, 0,1)=="\"" && substr($value, $len-1)=="\"")
    13. $value = substr($value,1, $len-1);
    14. $value = trim($value);
    15. if ($value == "" || $value == "null")
    16. continue;
    17. $rList[] = $value;
    18. }
    19. $rList[] =$salt;
    20. sort($rList, SORT_STRING);
    21. return md5(implode('&', $rList));
    22. }

    3.http请求

    1. function jsonPost($url, $postData, $customHeaders = []) {
    2. // 初始化curl
    3. $ch = curl_init($url);
    4. // 设置curl选项
    5. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 注意:不推荐在生产环境中禁用SSL验证
    6. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 返回结果而不是直接输出
    7. curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // 跟随重定向
    8. curl_setopt($ch, CURLOPT_POST, true); // 发送POST请求
    9. curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($postData)); // JSON格式数据
    10. // 设置HTTP头
    11. curl_setopt($ch, CURLOPT_HTTPHEADER, $customHeaders);
    12. // 执行请求
    13. $response = curl_exec($ch);
    14. // 检查是否有错误发生
    15. if (curl_errno($ch)) {
    16. $error = 'Curl error: ' . curl_error($ch);
    17. curl_close($ch); // 关闭curl资源
    18. return $error; // 返回错误信息
    19. }
    20. curl_close($ch); // 关闭curl资源
    21. // 直接返回原始响应,不进行json_decode
    22. return $response;
    23. }

    第三步回调处理

    1. public function notify(){
    2. $post = file_get_contents('php://input');
    3. $post=json_decode($post,true);
    4. $token='token';//抖音后台配置的token
    5. $post['token']=$token;
    6. $sign=$this->callbackSign($post);
    7. if($sign!=$post['msg_signature']){
    8. echo "签名失败";
    9. }
    10. $return=json_encode(["err_no"=>0,"err_tips"=>'success']);
    11. echo $return;exit;
    12. }

    回调签名

    1. public function callbackSign(array $params) {
    2. $data = [
    3. $params['timestamp'],
    4. (string) $params['nonce'],
    5. (string) $params['msg'],
    6. (string) $params['token'],
    7. ];
    8. sort($data, SORT_STRING);
    9. return hash('sha1', join('', $data));
    10. }

  • 相关阅读:
    企业数据管理中,细节至关重要
    校园跑腿小程序--表白墙--仿造微信朋友圈
    Spring面试题21:说一说Spring的@Required注解和@Qualifier注解
    element form中input使用@keyup.enter.native回车页面刷新问题
    Mysql 学习(十 三)InnoDB的BufferPool
    webpack学习笔记(webpack最通俗易懂的入门课程笔记,持续更新中)
    (附源码)计算机毕业设计SSM基于的民宿租赁系统
    去中心化数字身份为什么在元宇宙中这么重要
    鸿鹄工程项目管理系统em Spring Cloud+Spring Boot+前后端分离构建工程项目管理系统
    1155:回文三位数
  • 原文地址:https://blog.csdn.net/weixin_39934453/article/details/139477821