privacy.go 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  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. err = util.DecodeWithError(response, &result, "getprivacysetting")
  92. return result, err
  93. }
  94. // SetPrivacySetting 更新小程序权限配置
  95. func (s *Privacy) SetPrivacySetting(privacyVer int, ownerSetting OwnerSetting, settingList []SettingItem) error {
  96. if privacyVer == PrivacyV1 && len(settingList) > 0 {
  97. return errors.New("当 privacy_ver 传 2 或者不传时,setting_list 是必填;当 privacy_ver 传 1 时,该参数不可传")
  98. }
  99. accessToken, err := s.GetAccessToken()
  100. if err != nil {
  101. return err
  102. }
  103. response, err := util.PostJSON(fmt.Sprintf("%s?access_token=%s", setPrivacySettingURL, accessToken), SetPrivacySettingRequest{
  104. PrivacyVer: privacyVer,
  105. OwnerSetting: ownerSetting,
  106. SettingList: settingList,
  107. })
  108. if err != nil {
  109. return err
  110. }
  111. // 返回错误信息
  112. return util.DecodeWithCommonError(response, "setprivacysetting")
  113. }
  114. // UploadPrivacyExtFileResponse 上传权限定义模板响应参数
  115. type UploadPrivacyExtFileResponse struct {
  116. util.CommonError
  117. ExtFileMediaID string `json:"ext_file_media_id"`
  118. }
  119. // UploadPrivacyExtFile 上传权限定义模板
  120. func (s *Privacy) UploadPrivacyExtFile(fileData []byte) (UploadPrivacyExtFileResponse, error) {
  121. accessToken, err := s.GetAccessToken()
  122. if err != nil {
  123. return UploadPrivacyExtFileResponse{}, err
  124. }
  125. response, err := util.PostJSON(fmt.Sprintf("%s?access_token=%s", uploadPrivacyExtFileURL, accessToken), map[string][]byte{
  126. "file": fileData,
  127. })
  128. if err != nil {
  129. return UploadPrivacyExtFileResponse{}, err
  130. }
  131. // 返回错误信息
  132. var result UploadPrivacyExtFileResponse
  133. err = util.DecodeWithError(response, &result, "setprivacysetting")
  134. return result, err
  135. }