腾讯云市场自动交付接入实践

由于最近公司自主研发的第三方平台上线,需要上架腾讯云市场并打通商家入驻,试用,续费逻辑,我们开始了腾讯云市场自动交付api的接入
在线文档

流程

1.准备一个接收腾讯云事件的地址
2.在接收事件url中,实现如下图身份校验等六个接口


实现接口

3.进入腾讯云后台卖家控制台,配置参数如下图


参数配置

其中【发货url】即我们准备的接收事件url,【发货token】我们可以自行生成,用在接口中校验签名

开发

直接上代码
注:我已将所有业务方面的代码抽离了出去,所以本文提供的代码仅供参考,并不能直接运行使用,请结合自身项目情况实现接口

public function ship(Request $request){
        $param = $request->param();
        switch ($param['action']){
            case 'verifyInterface':
                //身份校验接口
                if(!$param['signature'] || !$param['timestamp'] || !$param['eventId']){
                    return 'param is miss';
                }
                $token = '这里换成你自己的token';
                $check = checkSignature($param['signature'],$token,$param['timestamp'],$param['eventId']);//这里使用的是腾讯云提供的签名校验函数
                if(!$check){
                    return 'Verification failed';
                }else{
                    $post_data = [
                        'echoback'=>$param['echoback']
                    ];
                    return json_encode($post_data);
                }
                break;
            case 'createInstance':
                $productInfo = $param['productInfo'];
                $signid = '我们生成11位的signid作为用户实例的标识';//同时我们需要向腾讯云返回一个免登后台地址,在这里我选用signid作为免登的token
                if($productInfo['isTrial'] == 'true'){
                    //试用版
                    //这里处理业务逻辑,创建商家,设置到期时间
                }else{
                    //正式版
                    $timeUnit = $productInfo['timeUnit'];
                    $timeSpan = $productInfo['timeSpan'];
                    switch ($timeUnit){
                        case 'y':
                            //购买年
                            $maturity_date = date('Y-m-d',strtotime("+".$timeSpan." year"));
                            break;
                        case 'm':
                            //购买月
                            $maturity_date = date('Y-m-d',strtotime("+".$timeSpan." month"));
                            break;
                        case 'd':
                            //购买日
                            $maturity_date = date('Y-m-d',strtotime("+".$timeSpan." day"));
                            break;
                    }
                  //这里根据腾讯云接口参数,获取商家购买时长,并处理业务逻辑
                }
               //这里构造个腾讯云接口规定的返回参数,返回
                $url = Config::base_uri;
                $post_data = [
                    'signId'=>$signid,//返回给腾讯云实例标识,之后的接口腾讯云会带着这个参数
                    'appInfo'=>[
                        'website'=>$url,//网站地址
                        'authUrl'=>$url.'/business?token='.$signid //后台免登地址
                    ],
                ];
                return json_encode($post_data);
                break;
            case 'renewInstance':
                //实例续费通知接口  
                $signid = $param['signId'];//这里是实例创建的时候我们生成的实例id,在这里返回,我们接收到之后处理对应商家的到期时间
                $instanceExpireTime = $param['instanceExpireTime'];//这个参数是datetime格式的实例到期日期,我们通过此参数修改数据库内的商家到期时间
                $data = [
                        'maturity_date'=>date('Y-m-d',strtotime($instanceExpireTime))
                    ];
                $post_data = [
                    'success'=>"true",
                ];
                return json_encode($post_data);
                break;
            case 'modifyInstance':
                //实例配置变更通知接口 这个接口是在商家试用转正式版支付完成时调用的
                $signid = $param['signId'];
                $instanceExpireTime = $param['instanceExpireTime'];
                 $data = [
                        'maturity_date'=>date('Y-m-d',strtotime($instanceExpireTime))
                    ];
                $post_data = [
                    'success'=>"true",
                ];
                return json_encode($post_data);
                break;
            case 'expireInstance':
                //实例过期通知接口 
                $post_data = [
                    'success'=>"true",
                ];
                return json_encode($post_data);
                break;
            case 'destroyInstance':
                //实例销毁通知接口
                $post_data = [
                    'success'=>"true",
                ];
                return json_encode($post_data);
                break;
        }
    }

/**
     * 腾讯云签名校验
     * @param $signature
     * @param $token
     * @param $timestamp
     * @param $eventId
     * @return bool
     */
    function checkSignature($signature, $token, $timestamp, $eventId)
    {
        $currentTimestamp = time();
        if ($currentTimestamp - $timestamp > 30) {
            return false;
        }
        $timestamp = (string)$timestamp;
        $eventId = (string)$eventId;
        $params = array($token, $timestamp, $eventId);
        sort($params, SORT_STRING);
        $str = implode('', $params);
        $requestSignature = hash('sha256', $str);
        return $signature === $requestSignature;
    }

在以上接口实现完毕之后,我们就可以登录卖家控制台配置参数并进行接口测试了
在接口测试无误后,即可创建商品,并提交审核,上架。

结语

分享几个在开发时遇到的有趣的事情


1577256946.jpg

看到了吗,腾讯云提供的测试数据有拼写错误,我在使用postman进行开发的时候用了测试数据进行开发,结果咖喱给给了~~
大家在开发的时候一定要以文档中的【请求参数】为准

1577257569(1).jpg

这个openId参数在用户没有接入开发平台时是没有的,所以并不能使用这个作为用户购买实例的标识,我们选择生成11位的不重复字符串signid返回给腾讯云作为实例标识
之后的接口腾讯云会带着signid请求,我们接收signid并处理不同接口的逻辑

以上就是我在腾讯云市场自动交付开发的经验,希望可以帮助到大家

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容