php实现抖音小程序支付

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

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

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

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

请求参数

属性 类型 必填 说明
order_id string 担保交易服务端订单号
order_token string 担保交易订单号 token
javascript 复制代码
methods: {

    requestPayment() {
      tt.showLoading();
	    getDeviceId().then(deviceId => {
	      tt.request({
		url: 'https://xxx.comm',
		method: 'POST',
		header: {
			'Content-Type': 'application/json',
			'token': '75dda91d-cb3d-4126-8f63-decee26e9ada'
		  },
		data: {
		  amount: 1,
		  device_id: deviceId ,
		  sid: 8 ,
		  uid: 1572 ,
		  pricebuy: 1 ,
		  lx: 2 ,
		  priced: 1 ,
		  sum: 1 ,
		  buytype: '抖音' ,
		},

		success: (res) => {
		  console.log('orderInfo是:', res.data.data);
		  console.log('order_id:', res.data.data.order_id);
		  console.log('order_id:', res.data.data.order_token);
		  tt.pay({
			orderInfo: {
			  order_id: res.data.data.order_id,
			  order_token:res.data.data.order_token
			},
			service: 5,
			success(res) {
			  if (res.code == 0) {
				// 支付成功处理逻辑,只有res.code=0时,才表示支付成功
				// 但是最终状态要以商户后端结果为准
			  }
			},
			fail(res) {
			  // 调起收银台失败处理逻辑
			},
		  });
	
		  tt.hideLoading();
		}
	      });
	    });
    }
  }

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

1.使用预下单接口

javascript 复制代码
//amount金额  subject标题 body详情  out_trade_no订单号  notify_url回调地址
public function pay($amount,$subject,$body,$out_trade_no,$notify_url)
    {
        $site=config('site');
        
        if($amount<=0){
            $this->error(__('金额不对'));
        }
        
        $amount=$amount*100;
        $url = 'https://developer.toutiao.com/api/apps/ecpay/v1/create_order';
        $data = [
            "app_id" => $site['douyin']['appid'],
            "out_order_no" =>$out_trade_no,
            "total_amount" => $amount,
            "subject" => $subject,
            "body" => $body,
            "valid_time" => 180,
            "cp_extra" =>$subject,
            "notify_url" => $notify_url
        ];
        $data['sign']= dysign($data,$site['douyin']['salt']);
        $res= jsonPost($url,$data);
        $res=json_decode($res,true);
        if(!is_array($res)){
            $this->error($res);
        }
        if($res['err_no']!=0){
            $this->error($res['err_tips']);
        }
        $payData=$res['data'];
        $this->success('订单提交成功 正在跳转支付',$payData);
    }

2.支付签名

javascript 复制代码
//支付签名
function sign($map,$salt) {
    $rList = [];
    foreach($map as $k =>$v) {
        if ($k == "other_settle_params" || $k == "app_id" || $k == "sign" || $k == "thirdparty_id")
            continue;

        $value = trim(strval($v));
        if (is_array($v)) {
            $value = arrayToStr($v);
        }

        $len = strlen($value);
        if ($len > 1 && substr($value, 0,1)=="\"" && substr($value, $len-1)=="\"")
            $value = substr($value,1, $len-1);
        $value = trim($value);
        if ($value == "" || $value == "null")
            continue;
        $rList[] = $value;
    }
    $rList[] =$salt;
    sort($rList, SORT_STRING);
    return md5(implode('&', $rList));
}

3.http请求

javascript 复制代码
   function jsonPost($url, $postData, $customHeaders = []) {
        // 初始化curl
        $ch = curl_init($url);

        // 设置curl选项
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 注意:不推荐在生产环境中禁用SSL验证
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 返回结果而不是直接输出
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // 跟随重定向
        curl_setopt($ch, CURLOPT_POST, true); // 发送POST请求
        curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($postData)); // JSON格式数据
        // 设置HTTP头
        curl_setopt($ch, CURLOPT_HTTPHEADER, $customHeaders);

        // 执行请求
        $response = curl_exec($ch);

        // 检查是否有错误发生
        if (curl_errno($ch)) {
            $error = 'Curl error: ' . curl_error($ch);
            curl_close($ch); // 关闭curl资源
            return $error; // 返回错误信息
        }

        curl_close($ch); // 关闭curl资源

        // 直接返回原始响应,不进行json_decode
        return $response;
    }

第三步回调处理

javascript 复制代码
    public function notify(){

        $post = file_get_contents('php://input');
        $post=json_decode($post,true);
        $token='token';//抖音后台配置的token
        $post['token']=$token;
        $sign=$this->callbackSign($post);
        if($sign!=$post['msg_signature']){
            echo "签名失败";
           
        }
        $return=json_encode(["err_no"=>0,"err_tips"=>'success']);
        echo $return;exit;
    }

回调签名

javascript 复制代码
   public   function callbackSign(array $params) {
            $data = [
                $params['timestamp'],
                (string) $params['nonce'],
                (string) $params['msg'],
                (string) $params['token'],
            ];

            sort($data, SORT_STRING);

            return hash('sha1', join('', $data));
        }
相关推荐
Lizhihao_17 分钟前
JAVA-队列
java·开发语言
远望清一色35 分钟前
基于MATLAB边缘检测博文
开发语言·算法·matlab
何曾参静谧44 分钟前
「Py」Python基础篇 之 Python都可以做哪些自动化?
开发语言·python·自动化
Prejudices1 小时前
C++如何调用Python脚本
开发语言·c++·python
青锐CC1 小时前
webman使用中间件验证指定的控制器及方法[青锐CC]
中间件·前端框架·php
我狠狠地刷刷刷刷刷1 小时前
中文分词模拟器
开发语言·python·算法
wyh要好好学习1 小时前
C# WPF 记录DataGrid的表头顺序,下次打开界面时应用到表格中
开发语言·c#·wpf
AitTech1 小时前
C#实现:电脑系统信息的全面获取与监控
开发语言·c#
qing_0406031 小时前
C++——多态
开发语言·c++·多态
孙同学_1 小时前
【C++】—掌握STL vector 类:“Vector简介:动态数组的高效应用”
开发语言·c++