附近小店
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 

232 行
7.7 KiB

  1. package weapp
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. )
  6. // apis
  7. const (
  8. apiAddNearbyPoi = "/wxa/addnearbypoi"
  9. apiDeleteNearbyPoi = "/wxa/delnearbypoi"
  10. apiGetNearbyPoiList = "/wxa/getnearbypoilist"
  11. apiSetNearbyPoiShowStatus = "/wxa/setnearbypoishowstatus"
  12. )
  13. // NearbyPoi 附近地点
  14. type NearbyPoi struct {
  15. PicList PicList `json:"pic_list"` // 门店图片,最多9张,最少1张,上传门店图片如门店外景、环境设施、商品服务等,图片将展示在微信客户端的门店页。图片链接通过文档https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1444738729中的《上传图文消息内的图片获取URL》接口获取。必填,文件格式为bmp、png、jpeg、jpg或gif,大小不超过5M pic_list是字符串,内容是一个json!
  16. ServiceInfos ServiceInfos `json:"service_infos"` // 必服务标签列表 选填,需要填写服务标签ID、APPID、对应服务落地页的path路径,详细字段格式见下方示例
  17. StoreName string `json:"store_name"` // 门店名字 必填,门店名称需按照所选地理位置自动拉取腾讯地图门店名称,不可修改,如需修改请重现选择地图地点或重新创建地点
  18. Hour string `json:"hour"` // 营业时间,格式11:11-12:12 必填
  19. Credential string `json:"credential"` // 资质号 必填, 15位营业执照注册号或9位组织机构代码
  20. Address string `json:"address"` // 地址 必填
  21. CompanyName string `json:"company_name"` // 主体名字 必填
  22. QualificationList string `json:"qualification_list"` // 证明材料 必填 如果company_name和该小程序主体不一致,需要填qualification_list,详细规则见附近的小程序使用指南-如何证明门店的经营主体跟公众号或小程序帐号主体相关http://kf.qq.com/faq/170401MbUnim17040122m2qY.html
  23. KFInfo KFInfo `json:"kf_info"` // 客服信息 选填,可自定义服务头像与昵称,具体填写字段见下方示例kf_info pic_list是字符串,内容是一个json!
  24. PoiID string `json:"poi_id"` // 如果创建新的门店,poi_id字段为空 如果更新门店,poi_id参数则填对应门店的poi_id 选填
  25. }
  26. // PicList 门店图片
  27. type PicList struct {
  28. List []string `json:"list"`
  29. }
  30. // ServiceInfos 必服务标签列表
  31. type ServiceInfos struct {
  32. ServiceInfos []ServiceInfo `json:"service_infos"`
  33. }
  34. // ServiceInfo 必服务标签
  35. type ServiceInfo struct {
  36. ID uint `json:"id"`
  37. Type uint8 `json:"type"`
  38. Name string `json:"name"`
  39. AppID string `json:"appid"`
  40. Path string `json:"path"`
  41. }
  42. // KFInfo // 客服信息
  43. type KFInfo struct {
  44. OpenKF bool `json:"open_kf"`
  45. KFHeading string `json:"kf_headimg"`
  46. KFName string `json:"kf_name"`
  47. }
  48. // AddNearbyPoiResponse response of add position.
  49. type AddNearbyPoiResponse struct {
  50. CommonError
  51. Data struct {
  52. AuditID string `json:"audit_id"` // 审核单 ID
  53. PoiID string `json:"poi_id"` // 附近地点 ID
  54. RelatedCredential string `json:"related_credential"` // 经营资质证件号
  55. } `json:"data"`
  56. }
  57. // Add 添加地点
  58. // token 接口调用凭证
  59. func (p *NearbyPoi) Add(token string) (*AddNearbyPoiResponse, error) {
  60. api := baseURL + apiAddNearbyPoi
  61. return p.add(api, token)
  62. }
  63. func (p *NearbyPoi) add(api, token string) (*AddNearbyPoiResponse, error) {
  64. pisList, err := json.Marshal(p.PicList)
  65. if err != nil {
  66. return nil, fmt.Errorf("failed to marshal picture list to json: %v", err)
  67. }
  68. serviceInfos, err := json.Marshal(p.ServiceInfos)
  69. if err != nil {
  70. return nil, fmt.Errorf("failed to marshal service info list to json: %v", err)
  71. }
  72. kfInfo, err := json.Marshal(p.KFInfo)
  73. if err != nil {
  74. return nil, fmt.Errorf("failed to marshal customer service staff info list to json: %v", err)
  75. }
  76. url, err := tokenAPI(api, token)
  77. if err != nil {
  78. return nil, err
  79. }
  80. params := requestParams{
  81. "is_comm_nearby": "1",
  82. "pic_list": string(pisList),
  83. "service_infos": string(serviceInfos),
  84. "store_name": p.StoreName,
  85. "hour": p.Hour,
  86. "credential": p.Credential,
  87. "address": p.Address,
  88. "company_name": p.CompanyName,
  89. "qualification_list": p.QualificationList,
  90. "kf_info": string(kfInfo),
  91. "poi_id": p.PoiID,
  92. }
  93. res := new(AddNearbyPoiResponse)
  94. if err := postJSON(url, params, res); err != nil {
  95. return nil, err
  96. }
  97. return res, nil
  98. }
  99. // DeleteNearbyPoi 删除地点
  100. // token 接口调用凭证
  101. // id 附近地点 ID
  102. func DeleteNearbyPoi(token, id string) (*CommonError, error) {
  103. api := baseURL + apiDeleteNearbyPoi
  104. return deleteNearbyPoi(api, token, id)
  105. }
  106. func deleteNearbyPoi(api, token, id string) (*CommonError, error) {
  107. url, err := tokenAPI(api, token)
  108. if err != nil {
  109. return nil, err
  110. }
  111. params := requestParams{
  112. "poi_id": id,
  113. }
  114. res := new(CommonError)
  115. if err := postJSON(url, params, res); err != nil {
  116. return nil, err
  117. }
  118. return res, nil
  119. }
  120. // PositionList 地点列表
  121. type PositionList struct {
  122. CommonError
  123. Data struct {
  124. LeftApplyNum uint `json:"left_apply_num"` // 剩余可添加地点个数
  125. MaxApplyNum uint `json:"max_apply_num"` // 最大可添加地点个数
  126. Data struct {
  127. List []struct {
  128. PoiID string `json:"poi_id"` // 附近地点 ID
  129. QualificationAddress string `json:"qualification_address"` // 资质证件地址
  130. QualificationNum string `json:"qualification_num"` // 资质证件证件号
  131. AuditStatus int `json:"audit_status"` // 地点审核状态
  132. DisplayStatus int `json:"display_status"` // 地点展示在附近状态
  133. RefuseReason string `json:"refuse_reason"` // 审核失败原因,audit_status=4 时返回
  134. } `json:"poi_list"` // 地址列表
  135. } `json:"-"`
  136. RawData string `json:"data"` // 地址列表的 JSON 格式字符串
  137. } `json:"data"` // 返回数据
  138. }
  139. // GetNearbyPoiList 查看地点列表
  140. // token 接口调用凭证
  141. // page 起始页id(从1开始计数)
  142. // rows 每页展示个数(最多1000个)
  143. func GetNearbyPoiList(token string, page, rows uint) (*PositionList, error) {
  144. api := baseURL + apiGetNearbyPoiList
  145. return getNearbyPoiList(api, token, page, rows)
  146. }
  147. func getNearbyPoiList(api, token string, page, rows uint) (*PositionList, error) {
  148. url, err := tokenAPI(api, token)
  149. if err != nil {
  150. return nil, err
  151. }
  152. params := requestParams{
  153. "page": page,
  154. "page_rows": rows,
  155. }
  156. res := new(PositionList)
  157. if err := postJSON(url, params, res); err != nil {
  158. return nil, err
  159. }
  160. err = json.Unmarshal([]byte(res.Data.RawData), &res.Data.Data)
  161. if err != nil {
  162. return nil, err
  163. }
  164. return res, nil
  165. }
  166. // NearbyPoiShowStatus 展示状态
  167. type NearbyPoiShowStatus int8
  168. // 所有展示状态
  169. const (
  170. HideNearbyPoi NearbyPoiShowStatus = iota // 不展示
  171. ShowNearbyPoi // 展示
  172. )
  173. // SetNearbyPoiShowStatus 展示/取消展示附近小程序
  174. // token 接口调用凭证
  175. // poiID 附近地点 ID
  176. // status 是否展示
  177. func SetNearbyPoiShowStatus(token, poiID string, status NearbyPoiShowStatus) (*CommonError, error) {
  178. api := baseURL + apiSetNearbyPoiShowStatus
  179. return setNearbyPoiShowStatus(api, token, poiID, status)
  180. }
  181. func setNearbyPoiShowStatus(api, token, poiID string, status NearbyPoiShowStatus) (*CommonError, error) {
  182. url, err := tokenAPI(api, token)
  183. if err != nil {
  184. return nil, err
  185. }
  186. params := requestParams{
  187. "poi_id": poiID,
  188. "status": status,
  189. }
  190. res := new(CommonError)
  191. if err := postJSON(url, params, res); err != nil {
  192. return nil, err
  193. }
  194. return res, nil
  195. }