抖音通用交易系统 下单参数生成 和 生成byteAuthorization 生成示例

93 阅读1分钟

 前提条件必须 生成应用公匙和私匙

如何生成 前往当前文章查看

抖音 通用交易系统 下单 密钥生成-CSDN博客文章浏览阅读90次。把生成的公匙 复制 在linux 系统中 创建文件 private_key.pem 并将公匙粘贴。在小程序中 生成应用公匙。 https://blog.csdn.net/fuchto/article/details/138287881

公匙私匙,签名等校验地址 

 API调试台https://developer.open-douyin.com/docs/openapi-explorer/sign 

抖音签名算法生成文档

developer.open-douyin.com/docs/resour…https://developer.open-douyin.com/docs/resource/zh-CN/mini-app/develop/server/signature-algorithm/#1438232c

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;
    }