privacy.go 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. package privacy
  2. import (
  3. "errors"
  4. "fmt"
  5. "github.com/silenceper/wechat/v2/miniprogram/context"
  6. "github.com/silenceper/wechat/v2/util"
  7. )
  8. // Privacy 小程序授权隐私设置
  9. type Privacy struct {
  10. *context.Context
  11. }
  12. // NewPrivacy 实例化小程序隐私接口
  13. // 文档地址 https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/2.0/api/privacy_config/set_privacy_setting.html
  14. func NewPrivacy(context *context.Context) *Privacy {
  15. if context == nil {
  16. panic("NewPrivacy got a nil context")
  17. }
  18. return &Privacy{
  19. context,
  20. }
  21. }
  22. // OwnerSetting 收集方(开发者)信息配置
  23. type OwnerSetting struct {
  24. ContactEmail string `json:"contact_email"`
  25. ContactPhone string `json:"contact_phone"`
  26. ContactQQ string `json:"contact_qq"`
  27. ContactWeixin string `json:"contact_weixin"`
  28. ExtFileMediaID string `json:"ext_file_media_id"`
  29. NoticeMethod string `json:"notice_method"`
  30. StoreExpireTimestamp string `json:"store_expire_timestamp"`
  31. }
  32. // SettingItem 收集权限的配置
  33. type SettingItem struct {
  34. PrivacyKey string `json:"privacy_key"`
  35. PrivacyText string `json:"privacy_text"`
  36. }
  37. // SetPrivacySettingRequest 设置权限的请求参数
  38. type SetPrivacySettingRequest struct {
  39. PrivacyVer int `json:"privacy_ver"`
  40. OwnerSetting OwnerSetting `json:"owner_setting"`
  41. SettingList []SettingItem `json:"setting_list"`
  42. }
  43. const (
  44. setPrivacySettingURL = "https://api.weixin.qq.com/cgi-bin/component/setprivacysetting"
  45. getPrivacySettingURL = "https://api.weixin.qq.com/cgi-bin/component/getprivacysetting"
  46. uploadPrivacyExtFileURL = "https://api.weixin.qq.com/cgi-bin/component/uploadprivacyextfile"
  47. // PrivacyV1 用户隐私保护指引的版本,1表示现网版本。
  48. PrivacyV1 = 1
  49. // PrivacyV2 2表示开发版。默认是2开发版。
  50. PrivacyV2 = 2
  51. )
  52. // GetPrivacySettingResponse 获取权限配置的响应结果
  53. type GetPrivacySettingResponse struct {
  54. util.CommonError
  55. CodeExist int `json:"code_exist"`
  56. PrivacyList []string `json:"privacy_list"`
  57. SettingList []SettingResponseItem `json:"setting_list"`
  58. UpdateTime int64 `json:"update_time"`
  59. OwnerSetting OwnerSetting `json:"owner_setting"`
  60. PrivacyDesc DescList `json:"privacy_desc"`
  61. }
  62. // SettingResponseItem 获取权限设置的响应明细
  63. type SettingResponseItem struct {
  64. PrivacyKey string `json:"privacy_key"`
  65. PrivacyText string `json:"privacy_text"`
  66. PrivacyLabel string `json:"privacy_label"`
  67. }
  68. // DescList 权限列表(保持与官方一致)
  69. type DescList struct {
  70. PrivacyDescList []Desc `json:"privacy_desc_list"`
  71. }
  72. // Desc 权限列表明细(保持与官方一致)
  73. type Desc struct {
  74. PrivacyDesc string `json:"privacy_desc"`
  75. PrivacyKey string `json:"privacy_key"`
  76. }
  77. // GetPrivacySetting 获取小程序权限配置
  78. func (s *Privacy) GetPrivacySetting(privacyVer int) (GetPrivacySettingResponse, error) {
  79. accessToken, err := s.GetAccessToken()
  80. if err != nil {
  81. return GetPrivacySettingResponse{}, err
  82. }
  83. response, err := util.PostJSON(fmt.Sprintf("%s?access_token=%s", getPrivacySettingURL, accessToken), map[string]int{
  84. "privacy_ver": privacyVer,
  85. })
  86. if err != nil {
  87. return GetPrivacySettingResponse{}, err
  88. }
  89. // 返回错误信息
  90. var result GetPrivacySettingResponse
  91. if err = util.DecodeWithError(response, &result, "getprivacysetting"); err != nil {
  92. return GetPrivacySettingResponse{}, err
  93. }
  94. return result, nil
  95. }
  96. // SetPrivacySetting 更新小程序权限配置
  97. func (s *Privacy) SetPrivacySetting(privacyVer int, ownerSetting OwnerSetting, settingList []SettingItem) error {
  98. if privacyVer == PrivacyV1 && len(settingList) > 0 {
  99. return errors.New("当privacy_ver传2或者不传时,setting_list是必填;当privacy_ver传1时,该参数不可传")
  100. }
  101. accessToken, err := s.GetAccessToken()
  102. if err != nil {
  103. return err
  104. }
  105. response, err := util.PostJSON(fmt.Sprintf("%s?access_token=%s", setPrivacySettingURL, accessToken), SetPrivacySettingRequest{
  106. PrivacyVer: privacyVer,
  107. OwnerSetting: ownerSetting,
  108. SettingList: settingList,
  109. })
  110. if err != nil {
  111. return err
  112. }
  113. // 返回错误信息
  114. if err = util.DecodeWithCommonError(response, "setprivacysetting"); err != nil {
  115. return err
  116. }
  117. return err
  118. }
  119. // UploadPrivacyExtFileResponse 上传权限定义模板响应参数
  120. type UploadPrivacyExtFileResponse struct {
  121. util.CommonError
  122. ExtFileMediaID string `json:"ext_file_media_id"`
  123. }
  124. // UploadPrivacyExtFile 上传权限定义模板
  125. func (s *Privacy) UploadPrivacyExtFile(fileData []byte) (UploadPrivacyExtFileResponse, error) {
  126. accessToken, err := s.GetAccessToken()
  127. if err != nil {
  128. return UploadPrivacyExtFileResponse{}, err
  129. }
  130. response, err := util.PostJSON(fmt.Sprintf("%s?access_token=%s", uploadPrivacyExtFileURL, accessToken), map[string][]byte{
  131. "file": fileData,
  132. })
  133. if err != nil {
  134. return UploadPrivacyExtFileResponse{}, err
  135. }
  136. // 返回错误信息
  137. var result UploadPrivacyExtFileResponse
  138. if err = util.DecodeWithError(response, &result, "setprivacysetting"); err != nil {
  139. return UploadPrivacyExtFileResponse{}, err
  140. }
  141. return result, err
  142. }