前提条件必须 生成应用公匙和私匙
如何生成 前往当前文章查看
公匙私匙,签名等校验地址
API调试台https://developer.open-douyin.com/docs/openapi-explorer/sign
抖音签名算法生成文档
php 解决
抖音 requestOrder:fail data.skuList should be array
抖音 requestOrder:fail 签名校验异常
抖音 requestOrder:fail 签名参数异常
需要注意的是 skuList 必须是二维数据组 因为 json 后 需要是 数组的形式
订单详情里的 页面 参数 必须 json 编码
最后返回前端也必须 要 json 编码
示例:
// 下单参数示例
$data = [
// 商品信息
'skuList' => [
[
'skuId' => '22',
'price' => 100,
'quantity' => 1,
'title' => '商品1',
'imageList' => [
'图片地址'
],
'type' => 301(商品类型必须是数值类型),
// 交易规则标签组
'tagGroupId' => ''
]
],
'outOrderNo' => '自己生成的订单号',
'totalAmount' => 100,
'payExpireSeconds' => 1800,
// 订单详情
'orderEntrySchema' => [
// 商品详情页
'path' => "pages/button/buttom",
'params' => json_encode(['参数名'=> '参数值'],0)
]
];
// 时间戳
$timestamp = time();
// 随机字符串
$nonceStr = $this->randStr(10);
// 应用公钥版本,每次重新上传公钥后需要更新,可通过「开发管理-开发设置-密钥设置」处获取
$keyVersion = 2;
// 开始调用
$this->getByteAuthorization('应用私匙',json_encode($data,0),'小程序appid',$nonceStr,$timestamp,$keyVersion);
// 构建鉴权字符
function getByteAuthorization($privateKeyStr, $data, $appId, $nonceStr, $timestamp, $keyVersion) {
$byteAuthorization = '';
// 读取私钥
$privateKey = openssl_pkey_get_private($privateKeyStr);
if (!$privateKey) {
throw new InvalidArgumentException("Invalid private key");
}
// 生成签名
$signature = $this->getSignature("POST", "/requestOrder", $timestamp, $nonceStr, $data, $privateKey);
if ($signature === false) {
return null;
}
// 第三步:生成byteAuthorization
// 构造 byteAuthorization
$byteAuthorization = sprintf("SHA256-RSA2048 appid=%s,nonce_str=%s,timestamp=%s,key_version=%s,signature=%s", $appId, $nonceStr, $timestamp, $keyVersion, $signature);
return $byteAuthorization;
}
/**
* 构建签名串
* @param $method
* @param $url
* @param $timestamp
* @param $nonce
* @param $data
* @param $privateKey
* @return string
*/
function getSignature($method, $url, $timestamp, $nonce, $data, $privateKey) {
// printf("method:%s\n url:%s\n timestamp:%s\n nonce:%s\n data:%s", $method, $url, $timestamp, $nonce, $data);
// 第一步:构造待签名串
$targetStr = $method. "\n" . $url. "\n" . $timestamp. "\n" . $nonce. "\n" . $data. "\n";
// 使用「应用私钥」对待签名串进行SHA256-RSA2048签名,并对签名结果进行Base64编码得到签名值。
openssl_sign($targetStr, $sign, $privateKey, OPENSSL_ALGO_SHA256);
$sign = base64_encode($sign);
return $sign;
}
function randStr($length = 8) {
$chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
$str = '';
for ($i = 0; $i < $length; $i++) {
$str .= $chars[mt_rand(0, strlen($chars) - 1)];
}
return $str;
}