invoice.go 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. package invoice
  2. import (
  3. "fmt"
  4. "github.com/silenceper/wechat/v2/util"
  5. )
  6. const (
  7. // getInvoiceInfoURL 查询电子发票
  8. getInvoiceInfoURL = "https://qyapi.weixin.qq.com/cgi-bin/card/invoice/reimburse/getinvoiceinfo?access_token=%s"
  9. // updateInvoiceStatusURL 更新发票状态
  10. updateInvoiceStatusURL = "https://qyapi.weixin.qq.com/cgi-bin/card/invoice/reimburse/updateinvoicestatus?access_token=%s"
  11. // updateStatusBatchURL 批量更新发票状态
  12. updateStatusBatchURL = "https://qyapi.weixin.qq.com/cgi-bin/card/invoice/reimburse/updatestatusbatch?access_token=%s"
  13. // getInvoiceInfoBatchURL 批量查询电子发票
  14. getInvoiceInfoBatchURL = "https://qyapi.weixin.qq.com/cgi-bin/card/invoice/reimburse/getinvoiceinfobatch?access_token=%s"
  15. )
  16. // GetInvoiceInfoRequest 查询电子发票请求
  17. type GetInvoiceInfoRequest struct {
  18. CardID string `json:"card_id"`
  19. EncryptCode string `json:"encrypt_code"`
  20. }
  21. // GetInvoiceInfoResponse 查询电子发票响应
  22. type GetInvoiceInfoResponse struct {
  23. util.CommonError
  24. CardID string `json:"card_id"`
  25. BeginTime int64 `json:"begin_time"`
  26. EndTime int64 `json:"end_time"`
  27. OpenID string `json:"openid"`
  28. Type string `json:"type"`
  29. Payee string `json:"payee"`
  30. Detail string `json:"detail"`
  31. UserInfo UserInfo `json:"user_info"`
  32. }
  33. // UserInfo 发票的用户信息
  34. type UserInfo struct {
  35. Fee int64 `json:"fee"`
  36. Title string `json:"title"`
  37. BillingTime int64 `json:"billing_time"`
  38. BillingNo string `json:"billing_no"`
  39. BillingCode string `json:"billing_code"`
  40. Info []Info `json:"info"`
  41. FeeWithoutTax int64 `json:"fee_without_tax"`
  42. Tax int64 `json:"tax"`
  43. Detail string `json:"detail"`
  44. PdfURL string `json:"pdf_url"`
  45. TripPdfURL string `json:"trip_pdf_url"`
  46. ReimburseStatus string `json:"reimburse_status"`
  47. CheckCode string `json:"check_code"`
  48. BuyerNumber string `json:"buyer_number"`
  49. BuyerAddressAndPhone string `json:"buyer_address_and_phone"`
  50. BuyerBankAccount string `json:"buyer_bank_account"`
  51. SellerNumber string `json:"seller_number"`
  52. SellerAddressAndPhone string `json:"seller_address_and_phone"`
  53. SellerBankAccount string `json:"seller_bank_account"`
  54. Remarks string `json:"remarks"`
  55. Cashier string `json:"cashier"`
  56. Maker string `json:"maker"`
  57. }
  58. // Info 商品信息结构
  59. type Info struct {
  60. Name string `json:"name"`
  61. Num int64 `json:"num"`
  62. Unit string `json:"unit"`
  63. Fee int64 `json:"fee"`
  64. Price int64 `json:"price"`
  65. }
  66. // GetInvoiceInfo 查询电子发票
  67. // see https://developer.work.weixin.qq.com/document/path/90284
  68. func (r *Client) GetInvoiceInfo(req *GetInvoiceInfoRequest) (*GetInvoiceInfoResponse, error) {
  69. var (
  70. accessToken string
  71. err error
  72. )
  73. if accessToken, err = r.GetAccessToken(); err != nil {
  74. return nil, err
  75. }
  76. var response []byte
  77. if response, err = util.PostJSON(fmt.Sprintf(getInvoiceInfoURL, accessToken), req); err != nil {
  78. return nil, err
  79. }
  80. result := &GetInvoiceInfoResponse{}
  81. err = util.DecodeWithError(response, result, "GetInvoiceInfo")
  82. return result, err
  83. }
  84. // UpdateInvoiceStatusRequest 更新发票状态请求
  85. type UpdateInvoiceStatusRequest struct {
  86. CardID string `json:"card_id"`
  87. EncryptCode string `json:"encrypt_code"`
  88. ReimburseStatus string `json:"reimburse_status"`
  89. }
  90. // UpdateInvoiceStatus 更新发票状态
  91. // see https://developer.work.weixin.qq.com/document/path/90285
  92. func (r *Client) UpdateInvoiceStatus(req *UpdateInvoiceStatusRequest) error {
  93. var (
  94. accessToken string
  95. err error
  96. )
  97. if accessToken, err = r.GetAccessToken(); err != nil {
  98. return err
  99. }
  100. var response []byte
  101. if response, err = util.PostJSON(fmt.Sprintf(updateInvoiceStatusURL, accessToken), req); err != nil {
  102. return err
  103. }
  104. return util.DecodeWithCommonError(response, "UpdateInvoiceStatus")
  105. }
  106. // UpdateStatusBatchRequest 批量更新发票状态
  107. type UpdateStatusBatchRequest struct {
  108. OpenID string `json:"openid"`
  109. ReimburseStatus string `json:"reimburse_status"`
  110. InvoiceList []Invoice `json:"invoice_list"`
  111. }
  112. // Invoice 发票卡券
  113. type Invoice struct {
  114. CardID string `json:"card_id"`
  115. EncryptCode string `json:"encrypt_code"`
  116. }
  117. // UpdateStatusBatch 批量更新发票状态
  118. // see https://developer.work.weixin.qq.com/document/path/90286
  119. func (r *Client) UpdateStatusBatch(req *UpdateStatusBatchRequest) error {
  120. var (
  121. accessToken string
  122. err error
  123. )
  124. if accessToken, err = r.GetAccessToken(); err != nil {
  125. return err
  126. }
  127. var response []byte
  128. if response, err = util.PostJSON(fmt.Sprintf(updateStatusBatchURL, accessToken), req); err != nil {
  129. return err
  130. }
  131. return util.DecodeWithCommonError(response, "UpdateStatusBatch")
  132. }
  133. // GetInvoiceInfoBatchRequest 批量查询电子发票请求
  134. type GetInvoiceInfoBatchRequest struct {
  135. ItemList []Invoice `json:"item_list"`
  136. }
  137. // GetInvoiceInfoBatchResponse 批量查询电子发票响应
  138. type GetInvoiceInfoBatchResponse struct {
  139. util.CommonError
  140. ItemList []Item `json:"item_list"`
  141. }
  142. // Item 电子发票的结构化信息
  143. type Item struct {
  144. CardID string `json:"card_id"`
  145. BeginTime int64 `json:"begin_time"`
  146. EndTime int64 `json:"end_time"`
  147. OpenID string `json:"openid"`
  148. Type string `json:"type"`
  149. Payee string `json:"payee"`
  150. Detail string `json:"detail"`
  151. UserInfo UserInfo `json:"user_info"`
  152. }
  153. // GetInvoiceInfoBatch 批量查询电子发票
  154. // see https://developer.work.weixin.qq.com/document/path/90287
  155. func (r *Client) GetInvoiceInfoBatch(req *GetInvoiceInfoBatchRequest) (*GetInvoiceInfoBatchResponse, error) {
  156. var (
  157. accessToken string
  158. err error
  159. )
  160. if accessToken, err = r.GetAccessToken(); err != nil {
  161. return nil, err
  162. }
  163. var response []byte
  164. if response, err = util.PostJSON(fmt.Sprintf(getInvoiceInfoBatchURL, accessToken), req); err != nil {
  165. return nil, err
  166. }
  167. result := &GetInvoiceInfoBatchResponse{}
  168. err = util.DecodeWithError(response, result, "GetInvoiceInfoBatch")
  169. return result, err
  170. }