invoice.go 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  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. if err = util.DecodeWithError(response, result, "GetInvoiceInfo"); err != nil {
  82. return nil, err
  83. }
  84. return result, nil
  85. }
  86. // UpdateInvoiceStatusRequest 更新发票状态请求
  87. type UpdateInvoiceStatusRequest struct {
  88. CardID string `json:"card_id"`
  89. EncryptCode string `json:"encrypt_code"`
  90. ReimburseStatus string `json:"reimburse_status"`
  91. }
  92. // UpdateInvoiceStatus 更新发票状态
  93. // see https://developer.work.weixin.qq.com/document/path/90285
  94. func (r *Client) UpdateInvoiceStatus(req *UpdateInvoiceStatusRequest) error {
  95. var (
  96. accessToken string
  97. err error
  98. )
  99. if accessToken, err = r.GetAccessToken(); err != nil {
  100. return err
  101. }
  102. var response []byte
  103. if response, err = util.PostJSON(fmt.Sprintf(updateInvoiceStatusURL, accessToken), req); err != nil {
  104. return err
  105. }
  106. return util.DecodeWithCommonError(response, "UpdateInvoiceStatus")
  107. }
  108. // UpdateStatusBatchRequest 批量更新发票状态
  109. type UpdateStatusBatchRequest struct {
  110. OpenID string `json:"openid"`
  111. ReimburseStatus string `json:"reimburse_status"`
  112. InvoiceList []Invoice `json:"invoice_list"`
  113. }
  114. // Invoice 发票卡券
  115. type Invoice struct {
  116. CardID string `json:"card_id"`
  117. EncryptCode string `json:"encrypt_code"`
  118. }
  119. // UpdateStatusBatch 批量更新发票状态
  120. // see https://developer.work.weixin.qq.com/document/path/90286
  121. func (r *Client) UpdateStatusBatch(req *UpdateStatusBatchRequest) error {
  122. var (
  123. accessToken string
  124. err error
  125. )
  126. if accessToken, err = r.GetAccessToken(); err != nil {
  127. return err
  128. }
  129. var response []byte
  130. if response, err = util.PostJSON(fmt.Sprintf(updateStatusBatchURL, accessToken), req); err != nil {
  131. return err
  132. }
  133. return util.DecodeWithCommonError(response, "UpdateStatusBatch")
  134. }
  135. // GetInvoiceInfoBatchRequest 批量查询电子发票请求
  136. type GetInvoiceInfoBatchRequest struct {
  137. ItemList []Invoice `json:"item_list"`
  138. }
  139. // GetInvoiceInfoBatchResponse 批量查询电子发票响应
  140. type GetInvoiceInfoBatchResponse struct {
  141. util.CommonError
  142. ItemList []Item `json:"item_list"`
  143. }
  144. // Item 电子发票的结构化信息
  145. type Item struct {
  146. CardID string `json:"card_id"`
  147. BeginTime int64 `json:"begin_time"`
  148. EndTime int64 `json:"end_time"`
  149. OpenID string `json:"openid"`
  150. Type string `json:"type"`
  151. Payee string `json:"payee"`
  152. Detail string `json:"detail"`
  153. UserInfo UserInfo `json:"user_info"`
  154. }
  155. // GetInvoiceInfoBatch 批量查询电子发票
  156. // see https://developer.work.weixin.qq.com/document/path/90287
  157. func (r *Client) GetInvoiceInfoBatch(req *GetInvoiceInfoBatchRequest) (*GetInvoiceInfoBatchResponse, error) {
  158. var (
  159. accessToken string
  160. err error
  161. )
  162. if accessToken, err = r.GetAccessToken(); err != nil {
  163. return nil, err
  164. }
  165. var response []byte
  166. if response, err = util.PostJSON(fmt.Sprintf(getInvoiceInfoBatchURL, accessToken), req); err != nil {
  167. return nil, err
  168. }
  169. result := &GetInvoiceInfoBatchResponse{}
  170. if err = util.DecodeWithError(response, result, "GetInvoiceInfoBatch"); err != nil {
  171. return nil, err
  172. }
  173. return result, nil
  174. }