"pdd.ddk.goods.detail", 'daily_explosion_url' => 'pdd.ddk.goods.recommend.get', 'search_goods_url' => 'pdd.ddk.goods.search', 'auth_url' => 'pdd.ddk.rp.prom.url.generate', 'authority_url' => 'pdd.ddk.member.authority.query', 'universal_url' => 'pdd.ddk.goods.zs.unit.url.gen', //落地页转链 'generate_url' => 'pdd.ddk.goods.promotion.url.generate', 'increment_order_url' => 'pdd.ddk.order.list.increment.get', 'rang_order_url' => 'pdd.ddk.order.list.range.get' ]; const shop_type = "拼多多"; public function __construct() { parent::__construct(); $this->config = config('site.pinduoduo'); $this->appkey = $this->config['client_id']; $this->appSecret = $this->config['client_secret']; if(empty($this->appkey) || empty($this->appSecret)) return fault('配置信息错误'); } /** * 最后更新时间段增量同步推广订单信息 https://open.pinduoduo.com/application/document/api?id=pdd.ddk.order.list.increment.get * * @param [type] $start_update_time * @param [type] $end_update_time * @param [type] $query_order_type * @param [type] $page * @param string $page_size * @return void */ public function incrementOrder($start_update_time,$end_update_time,$query_order_type,$page,$page_size="50") { $params = [ 'start_update_time' => $start_update_time, 'end_update_time' => $end_update_time, 'query_order_type' => $query_order_type, 'page' => $page, 'page_size' => $page_size, ]; $send_data = $this->makeSign($params,self::request_url['increment_order_url']); $result = send_get(self::base_url,$send_data); if(empty($result)) return ['status'=>false,'info'=>'接口请求失败','total' => 0,'hasMore' => false]; if(isset($result['error_response']) && !empty($result['error_response'])) return ['status'=>false,'info'=>$result['error_response']['sub_msg'],'total' => 0,'hasMore' => false]; $list = isset($result['order_list_get_response']['order_list']) ? $result['order_list_get_response']['order_list'] : []; $total = isset($result['order_list_get_response']['total_count']) ? $result['order_list_get_response']['total_count'] : 0; return ['status'=>true,'info'=>'获取成功','list'=> $list, 'total' => $total,'hasMore' => count($list) == $page_size ? true : false]; } /** * 用时间段查询推广订单接口 https://open.pinduoduo.com/application/document/api?id=pdd.ddk.order.list.range.get * * @param [type] $start_time * @param [type] $end_time * @param [type] $query_order_type * @param string $last_order_id * @param integer $page_size * @return void */ public function rangOrder($start_time,$end_time,$query_order_type,$last_order_id="",$page_size=300) { $params = [ 'start_time' => $start_time, 'end_time' => $end_time, 'query_order_type' => $query_order_type, 'last_order_id' => $last_order_id, 'page_size' => $page_size, ]; $send_data = $this->makeSign($params,self::request_url['rang_order_url']); $result = send_get(self::base_url,$send_data); if(empty($result)) return ['status'=>false,'info'=>'接口请求失败','total' => 0,'hasMore' => false,'last_order_id' => '']; if(isset($result['error_response']) && !empty($result['error_response'])) return ['status'=>false,'info'=>$result['error_response']['sub_msg'],'total' => 0,'hasMore' => false,'last_order_id' => '']; $list = isset($result['order_list_get_response']['order_list']) ? $result['order_list_get_response']['order_list'] : []; $total = count($list); return ['status'=>true,'info'=>'获取成功','list'=> $list, 'total' => $total,'hasMore' => $total > $page_size ? true : false,'last_order_id' => isset($result['order_list_get_response']['last_order_id']) ? $result['order_list_get_response']['last_order_id'] : ""]; } /** * 签名参数 */ public function makeSign($params,$type) { $base_params = [ 'type' => $type, 'client_id' => $this->appkey, 'timestamp' => time(), ]; $data = !empty($params) ? array_merge($base_params,$params) : $base_params; ksort($data); $paramsStr = ''; foreach($data as $key => $item){ if($item !== ''){ $paramsStr .= sprintf('%s%s', $key, $item); }else{ unset($data[$key]); } } $sign = strtoupper(md5($this->appSecret .$paramsStr.$this->appSecret)); $data['sign'] = $sign; return $data; } /** * 获取商品详情信息 https://open.pinduoduo.com/application/document/api?id=pdd.ddk.goods.detail * * @param [type] $goods_sign 商品sign * @return void */ public function getGoodsDetail($goods_sign,$is_browse = true,$relationid='') { $params = [ 'goods_sign' => $goods_sign ]; if(!empty($relationid)) { $params['custom_parameters']='{"uid":"'.$relationid.'"}'; if(!empty(MOBILE_INFO)){ $params['pid'] = MOBILE_INFO == "IOS" ? $this->config['ios_pid'] : $this->config['android_pid']; }else{ return []; } } $send_data = $this->makeSign($params,self::request_url['goods_detail_url']); $result = send_get(self::base_url,$send_data); if(empty($result)) fault('数据获取失败'); //if(isset($result['error_response']) && !empty($result['error_response'])) fault('数据获取失败(-1)'); if(isset($result['error_response']) && !empty($result['error_response'])) return []; $goods = isset($result['goods_detail_response']['goods_details'][0]) ? $result['goods_detail_response']['goods_details'][0] : []; $goods = $this->initGoods($goods); if($is_browse)self::browseLog($goods); return $goods; } /** * 获取拼多多推荐分类 https://open.pinduoduo.com/application/document/api?id=pdd.ddk.goods.recommend.get * @return void */ public function getCate() { $cate_list = [ ['id' => '20100','name' => '百货'], ['id' => '20200','name' => '母婴'], ['id' => '20300','name' => '食品'], ['id' => '20400','name' => '女装'], ['id' => '20500','name' => '电器'], ['id' => '20600','name' => '鞋包'], ['id' => '20700','name' => '内衣'], ['id' => '20800','name' => '美妆'], ['id' => '20900','name' => '男装'], ['id' => '21000','name' => '水果'], ['id' => '21100','name' => '家纺'], ['id' => '21200','name' => '文具'], ['id' => '21300','name' => '运动'], ['id' => '21400','name' => '虚拟'], ['id' => '21500','name' => '汽车'], ['id' => '21600','name' => '家装'], ['id' => '21700','name' => '家具'], ['id' => '21800','name' => '医药'], ]; return $cate_list; } /** * 每日爆款 https://open.pinduoduo.com/application/document/api?id=pdd.ddk.goods.recommend.get * * @param [type] $cate_id 分类id * @param [type] $channel_type 进宝频道推广商品: 1-今日销量榜,4-猜你喜欢(和进宝网站精选一致),5-实时热销榜,6-实时收益榜。 * @param integer $page * @param [type] $page_size * @return void */ public function dailyExplosion($cate_id,$activity_tags,$channel_type,$list_id = 1,$page_size) { $params = [ 'activity_tags' => $activity_tags, 'cat_id' => $cate_id, 'channel_type' => $channel_type, 'limit' => $page_size, 'offset' => ($list_id - 1) * $page_size ]; $send_data = $this->makeSign($params,self::request_url['daily_explosion_url']); $result = send_get(self::base_url,$send_data,true); if(empty($result)) fault('数据获取失败'); if(isset($result['error_response']) && !empty($result['error_response'])) fault('数据获取失败(-1)'); $list = $result['goods_basic_detail_response']['list']; if(!empty($list)){ foreach($list as &$goods){ $goods = self::initGoods($goods); } } return ['list'=>$list,'list_id'=>$result['goods_basic_detail_response']['list_id']]; } /** * 商品转链 https://open.pinduoduo.com/application/document/api?id=pdd.ddk.goods.promotion.url.generate */ public function goodsGenerate($common_relation_id,$goods_sign) { if(!empty(MOBILE_INFO)){ $pid = MOBILE_INFO == "IOS" ? $this->config['ios_pid'] : $this->config['android_pid']; $params = [ 'p_id' => $pid, 'goods_sign_list' => '["'.$goods_sign.'"]', 'custom_parameters' => '{"uid":"'.$common_relation_id.'"}', 'generate_schema_url' => 'true', 'generate_short_url' => 'true' ]; $send_data = $this->makeSign($params,self::request_url['generate_url']); $result = send_get(self::base_url,$send_data); if(empty($result)) fault('数据获取失败'); if(isset($result['error_response']) && !empty($result['error_response'])) return $result;//fault('数据获取失败(-1)'); $list = $result['goods_promotion_url_generate_response']['goods_promotion_url_list']; if(isset($list[0])){ return $list[0]; }else{ return []; } }else{ return []; } } /** * 生成营销工具推广链接 https://open.pinduoduo.com/application/document/api?id=pdd.ddk.rp.prom.url.generate * * @param [type] $common_relation_id * @return void */ public function generate($common_relation_id,$channel_type) { if(!empty(MOBILE_INFO)){ $pid = MOBILE_INFO == "IOS" ? $this->config['ios_pid'] : $this->config['android_pid']; $params = [ 'p_id_list' => '["'.$pid.'"]', 'channel_type' => $channel_type, 'custom_parameters' => '{"uid":"'.$common_relation_id.'"}', 'generate_schema_url' => 'true', 'generate_short_url' => 'true' ]; $send_data = $this->makeSign($params,self::request_url['auth_url']); $result = send_get(self::base_url,$send_data); if(empty($result)) fault('数据获取失败'); if(isset($result['error_response']) && !empty($result['error_response'])) fault('数据获取失败(-1)'); $list = $result['rp_promotion_url_generate_response']['url_list']; if(isset($list[0])){ return $list[0]; }else{ return []; } }else{ return []; } } /** * 查询是否绑定备案 https://open.pinduoduo.com/application/document/api?id=pdd.ddk.member.authority.query * * @return void */ public function authority() { $ModelUser = new ModelUser(); $user = $ModelUser->get(USERID); if(!empty(MOBILE_INFO)){ if(!isset($user['pdd_authority_'.strtolower(MOBILE_INFO)])) fault('授权信息获取失败'); if($user['pdd_authority_'.strtolower(MOBILE_INFO)] == 1) return ['bind'=>1]; $pid = MOBILE_INFO == "IOS" ? $this->config['ios_pid'] : $this->config['android_pid']; $params = [ 'pid' => $pid, 'custom_parameters' => '{"uid":"'.$user['common_relation_id'].'"}', ]; $send_data = $this->makeSign($params,self::request_url['authority_url']); $result = send_get(self::base_url,$send_data); if(empty($result)) fault('数据获取失败'); if(isset($result['error_response']) && !empty($result['error_response'])) fault('数据获取失败(-1)'); $info = $result['authority_query_response']; if(MOBILE_INFO == "IOS"){ if($info['bind'] == 1 && $user['pdd_authority_ios'] == 0){ $res_i = $ModelUser->where(['id'=>$user['id']])->update(['pdd_authority_ios'=>1]); if(!$res_i) fault('授权信息更新失败'); } }else if(MOBILE_INFO == "ANDROID"){ if($info['bind'] == 1 && $user['pdd_authority_android'] == 0){ $res_a = $ModelUser->where(['id'=>$user['id']])->update(['pdd_authority_android'=>1]); if(!$res_a) fault('授权信息更新失败'); } } return ['bind'=>$info['bind']]; }else{ fault('未查询到当前平台授权信息'); } } /** * 搜索商品 https://open.pinduoduo.com/application/document/api?id=pdd.ddk.goods.search * * @param [type] $keyword 关键词 * @param [type] $list_id 翻页时必填前页返回的list_id值 * @param mixed $common_relation_id 用户授权id * @param [type] $pageSize * @param mixed $sort_type 排序方式:0-综合排序;1-按佣金比率升序;2-按佣金比例降序;3-按价格升序;4-按价格降序;5-按销量升序;6-按销量降序;7-优惠券金额排序升序;8-优惠券金额排序降序;9-券后价升序排序;10-券后价降序排序;11-按照加入多多进宝时间升序;12-按照加入多多进宝时间降序;13-按佣金金额升序排序;14-按佣金金额降序排序;15-店铺描述评分升序;16-店铺描述评分降序;17-店铺物流评分升序;18-店铺物流评分降序;19-店铺服务评分升序;20-店铺服务评分降序;27-描述评分击败同类店铺百分比升序,28-描述评分击败同类店铺百分比降序,29-物流评分击败同类店铺百分比升序,30-物流评分击败同类店铺百分比降序,31-服务评分击败同类店铺百分比升序,32-服务评分击败同类店铺百分比降序 * @return void */ public function searchGoods($keyword='',$opt_id='',$common_relation_id,$with_coupon = '',$page,$pageSize,$sort_type = 0,$cat_id='') { $params = [ 'keyword' => $keyword, 'opt_id' => $opt_id, 'page_size' => $pageSize, 'custom_parameters' => '{"uid":"'.$common_relation_id.'"}', 'with_coupon' => empty($with_coupon) ? '' : ($with_coupon == 1 ? "true" : "false"), 'page' => $page, 'sort_type' => $sort_type, 'cat_id' => $cat_id ]; if(!empty(MOBILE_INFO)){ $params['pid'] = MOBILE_INFO == "IOS" ? $this->config['ios_pid'] : $this->config['android_pid']; }else{ return []; } $send_data = $this->makeSign($params,self::request_url['search_goods_url']); $result = send_get(self::base_url,$send_data); if(empty($result) || isset($result['error_response'])) return []; //fault('数据获取失败'); $list = $result['goods_search_response']['goods_list']; if(!empty($list)){ $tmp = []; foreach($list as &$goods){ if(isset($goods['goods_id']) && isset($goods['goods_name'])){ $goods = self::initGoods($goods); array_push($tmp,$goods); } else if (isset($goods['goods_id']) && isset($goods['goods_sign'])) { $goods= self::getGoodsDetail($goods['goods_sign'],false); //array_push($tmp,$goods); } else{ $list = []; break; } } } return $list; } /** * 落地页转链 https://open.pinduoduo.com/application/document/api?id=pdd.ddk.goods.zs.unit.url.gen */ public function universal($common_relation_id,$goods_url) { $params = [ 'source_url' => $goods_url, 'custom_parameters' => '{"uid":"'.$common_relation_id.'"}', ]; if(!empty(MOBILE_INFO)){ $params['pid'] = MOBILE_INFO == "IOS" ? $this->config['ios_pid'] : $this->config['android_pid']; }else{ return []; } $send_data = $this->makeSign($params,self::request_url['universal_url']); $result = send_get(self::base_url,$send_data); if(empty($result)) fault('数据获取失败'); $info = isset($result['goods_zs_unit_generate_response']) ? $result['goods_zs_unit_generate_response'] : []; return isset($info['short_url']) ? $info['short_url'] : ''; } /** * 格式化商品信息 * * @param [type] $goods * @return void */ private static function initGoods($goods) { if(empty($goods)) return []; $init_goods = self::goodsField(); $init_goods['goods_sign'] = isset($goods['goods_sign']) ? $goods['goods_sign'] : ''; //商品goodsSign $init_goods['title'] = isset($goods['goods_name']) ? $goods['goods_name'] : ''; //商品标题 $init_goods['dtitle'] = isset($goods['goods_name']) ? $goods['goods_name'] : ''; //商品标题 $init_goods['goodsId'] = isset($goods['goods_id']) ? $goods['goods_id'] : ''; $actualPrice = $goods['min_group_price'] - $goods['coupon_discount']; $init_goods["actualPrice"] = $actualPrice/100; //券后价 $init_goods["originalPrice"] = $goods['min_group_price']/100; //商品原价 $init_goods["sellerId"] = isset($goods['mall_id']) ? $goods['mall_id'] : ''; //店铺Id $init_goods["shopName"] = isset($goods['mall_name']) ? $goods['mall_name'] : ''; //店铺名称 $init_goods['has_coupon'] = isset($goods['has_coupon']) ? $goods['has_coupon'] : 'false';// 是否带优惠券 $init_goods["couponPrice"] = isset($goods['coupon_discount']) ? $goods['coupon_discount']/100 : ''; //优惠券金额 $init_goods["monthSales"] = isset($goods['sales_tip']) ? format_number($goods['sales_tip']) : 0; //30天销量 $init_goods["mainPic"] = isset($goods['goods_image_url']) ? $goods['goods_image_url'] : ''; //商品主图 $init_goods['couponEndTime'] = isset($goods['coupon_end_time']) && !empty($goods['coupon_end_time']) ? date("Y-m-d",$goods['coupon_end_time']) : ''; //优惠券结束时间 $init_goods['couponStartTime'] = isset($goods['coupon_start_time']) && !empty($goods['coupon_start_time']) ? date("Y-m-d",$goods['coupon_start_time']) : ''; //优惠券开始时间 $init_goods['descScore'] = isset($goods['desc_txt']) ? $goods['desc_txt'] : ''; //描述分 $init_goods['serviceScore'] = isset($goods['serv_txt']) ? $goods['serv_txt'] : ''; //服务分 $init_goods['shopType'] = self::shop_type; //店铺类型 $init_goods['shopLogo'] = isset($goods['mall_img_url']) ? $goods['mall_img_url'] : ''; $init_goods['sourceType'] = "pdd"; $init_goods['faction'] = "p"; $init_goods['predictPromotionRate']= isset($goods['predict_promotion_rate']) ? $goods['predict_promotion_rate'] : 1; $init_goods['desc'] = isset($goods['goods_desc']) ? $goods['goods_desc'] : ''; //推广文案 $init_goods['imgs'] = $init_goods['detailPics'] = isset($goods['goods_gallery_urls']) ? $goods['goods_gallery_urls'] : ''; //轮播图 $init_goods['video'] = isset($goods['video_url']) ? $goods['video_url'] : ''; //视频 if(isset($goods['material_list']) && !empty($goods['material_list'])){ foreach($goods['material_list'] as $item){ if($item['type'] == 1)$init_goods['detailPics'] = array_merge($init_goods['detailPics'],$item['image_list']); if($item['type'] == 2 && empty($init_goods['video']))$init_goods['video'] = $item['thumbnail_url']; } } if(empty($init_goods['detailPics']))$init_goods['detailPics'] = $init_goods['mainPic']; $init_goods['labelImg'] = self::initSourse($init_goods['sourceType']); $init_goods['isCollect'] = self::isCollect($init_goods); $init_goods['fanli'] = self::rebate($init_goods["actualPrice"],$goods['promotion_rate']/1000); $init_goods['topFanli'] = self::rebate($init_goods['actualPrice'],$goods['promotion_rate']/1000,self::$topFanliRate); //新增商品类目ID--byhyt $init_goods['cid'] = isset($goods['cat_ids'][0]) ? $goods['cat_ids'][0] : ''; return $init_goods; } }