由于最近公司自主研发的第三方平台上线,需要上架腾讯云市场并打通商家入驻,试用,续费逻辑,我们开始了腾讯云市场自动交付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并处理不同接口的逻辑
以上就是我在腾讯云市场自动交付开发的经验,希望可以帮助到大家