Skip to content

Commit

Permalink
Feature/v1.5.108 (#455)
Browse files Browse the repository at this point in the history
* v1.5.108

* 新增 新版微信商家转账接口
  • Loading branch information
iGoogle-ink authored Jan 22, 2025
1 parent 4bb93de commit 9c0d8bf
Show file tree
Hide file tree
Showing 9 changed files with 1,216 additions and 1,014 deletions.
5 changes: 2 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ go get github.com/go-pay/gopay

#### 查看 GoPay 版本

[版本更新记录](https://github.com/go-pay/gopay/blob/main/release_note.txt)
[版本更新记录](https://github.com/go-pay/gopay/blob/main/release_note.md)

```go
import (
Expand All @@ -48,8 +48,7 @@ func main() {
* #### [支付宝支付(V3版)](https://github.com/go-pay/gopay/blob/main/doc/alipay_v3.md)
* #### [支付宝支付](https://github.com/go-pay/gopay/blob/main/doc/alipay.md)
* #### [微信支付(V3版)](https://github.com/go-pay/gopay/blob/main/doc/wechat_v3.md)
* 微信商家转账产品升级,目前了解下来老接口暂不受影响,后续gopay会尽快增加新版的商家转账接口,各位用到的关注一下:https://developers.weixin.qq.com/community/pay/doc/000a060bb4c13095b6b27cc1b6ac01
* 【fork】`已更新`
* 微信商家转账产品升级,目前已支持新版商家转账接口
* #### [微信支付(V2版,不推荐)](https://github.com/go-pay/gopay/blob/main/doc/wechat_v2.md)
* #### [QQ支付](https://github.com/go-pay/gopay/blob/main/doc/qq.md)
* #### [通联支付](https://github.com/go-pay/gopay/blob/main/doc/allinpay.md)
Expand Down
9 changes: 9 additions & 0 deletions doc/wechat_v3.md
Original file line number Diff line number Diff line change
Expand Up @@ -413,6 +413,15 @@ wechat.V3DecryptCombineNotifyCipherText()
* 微信明细单号查询明细单:`client.V3PartnerTransferDetail()`
* 商家批次单号查询批次单:`client.V3PartnerTransferMerchantQuery()`
* 商家明细单号查询明细单:`client.V3PartnerTransferMerchantDetail()`
* <font color='#07C160' size='4'>商家转账(新版)</font>
* 发起转账:`client.V3TransferBills()`
* 撤销转账:`client.V3TransferBillsCancel()`
* 商户单号查询转账单:`client.V3TransferBillsMerchantQuery()`
* 微信单号查询转账单:`client.V3TransferBillsQuery()`
* 商户单号申请电子回单:`client.V3TransferElecsignMerchant()`
* 微信单号申请电子回单:`client.V3TransferElecsign()`
* 商户单号查询电子回单:`client.V3TransferElecsignQuery()`
* 微信单号查询电子回单:`client.V3TransferElecsignMerchantQuery()`
* <font color='#07C160' size='4'>余额查询</font>
* 查询特约商户账户实时余额:`client.V3EcommerceBalance()`
* 查询二级商户账户日终余额:`client.V3EcommerceDayBalance()`
Expand Down
1,123 changes: 1,123 additions & 0 deletions release_note.md

Large diffs are not rendered by default.

934 changes: 0 additions & 934 deletions release_note.txt

This file was deleted.

1 change: 1 addition & 0 deletions wechat/v3/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,7 @@ func (c *ClientV3) AutoVerifySign(autoRefresh ...bool) (err error) {
return nil
}

// AutoVerifySignByCert 设置 微信公钥证书 和 微信公钥证书ID
// wxPublicKeyContent:微信公钥证书文件内容[]byte
// wxPublicKeyID:微信公钥证书ID
func (c *ClientV3) AutoVerifySignByCert(wxPublicKeyContent []byte, wxPublicKeyID string) (err error) {
Expand Down
2 changes: 1 addition & 1 deletion wechat/v3/encrypt_decrypt.go
Original file line number Diff line number Diff line change
Expand Up @@ -322,7 +322,7 @@ func V3DecryptTransferBatchNotifyCipherText(ciphertext, nonce, additional, apiV3
return result, nil
}

// 解密 商家转账批次回调通知 回调中的加密信息
// 解密 新版商家转账通知 回调中的加密信息
func V3DecryptTransferBillsNotifyCipherText(ciphertext, nonce, additional, apiV3Key string) (result *V3DecryptTransferBillsResult, err error) {
cipherBytes, _ := base64.StdEncoding.DecodeString(ciphertext)
decrypt, err := aes.GCMDecrypt(cipherBytes, []byte(nonce), []byte(additional), []byte(apiV3Key))
Expand Down
4 changes: 2 additions & 2 deletions wechat/v3/model_transfer_bills.go
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ type TransferBillsCancel struct {
}

type TransferBillsMerchantQuery struct {
MchID string `json:"mch_id"`
Mchid string `json:"mch_id"`
OutBillNo string `json:"out_bill_no"`
TransferBillNo string `json:"transfer_bill_no"`
Appid string `json:"appid"`
Expand All @@ -98,7 +98,7 @@ type TransferBillsMerchantQuery struct {
}

type TransferBillsQuery struct {
MchID string `json:"mch_id"`
Mchid string `json:"mch_id"`
OutBillNo string `json:"out_bill_no"`
TransferBillNo string `json:"transfer_bill_no"`
Appid string `json:"appid"`
Expand Down
71 changes: 40 additions & 31 deletions wechat/v3/notify.go
Original file line number Diff line number Diff line change
Expand Up @@ -291,18 +291,15 @@ type V3DecryptTransferBatchResult struct {

// 商家转账新版本回调通知 解密结果
type V3DecryptTransferBillsResult struct {
ID string `json:"id"`
CreateTime string `json:"create_time"`
EventType string `json:"event_type"`
ResourceType string `json:"resource_type"`
Resource struct {
Algorithm string `json:"algorithm"`
Ciphertext string `json:"ciphertext"`
AssociatedData string `json:"associated_data"`
OriginalType string `json:"original_type"`
Nonce string `json:"nonce"`
} `json:"resource"`
Summary string `json:"summary"`
OutBillNo string `json:"out_bill_no"`
TransferBillNo string `json:"transfer_bill_no"`
State string `json:"state"`
MchId string `json:"mch_id"`
TransferAmount int `json:"transfer_amount"`
Openid string `json:"openid"`
FailReason string `json:"fail_reason"`
CreateTime string `json:"create_time"`
UpdateTime string `json:"update_time"`
}

// =====================================================================================================================
Expand Down Expand Up @@ -378,7 +375,7 @@ func (v *V3NotifyReq) DecryptCipherTextToStruct(apiV3Key string, objPtr any) (er
if v.Resource != nil {
err = V3DecryptNotifyCipherTextToStruct(v.Resource.Ciphertext, v.Resource.Nonce, v.Resource.AssociatedData, apiV3Key, objPtr)
if err != nil {
return fmt.Errorf("V3NotifyReq(%s) decrypt cipher text error(%w)", js.MarshalString(v), err)
return fmt.Errorf("V3NotifyReq(%s) decrypt cipher text err(%w)", js.MarshalString(v), err)
}
return nil
}
Expand All @@ -390,7 +387,7 @@ func (v *V3NotifyReq) DecryptPayCipherText(apiV3Key string) (result *V3DecryptPa
if v.Resource != nil {
result, err = V3DecryptPayNotifyCipherText(v.Resource.Ciphertext, v.Resource.Nonce, v.Resource.AssociatedData, apiV3Key)
if err != nil {
return nil, fmt.Errorf("V3NotifyReq(%s) decrypt cipher text error(%w)", js.MarshalString(v), err)
return nil, fmt.Errorf("V3NotifyReq(%s) decrypt cipher text err(%w)", js.MarshalString(v), err)
}
return result, nil
}
Expand All @@ -402,7 +399,7 @@ func (v *V3NotifyReq) DecryptPartnerPayCipherText(apiV3Key string) (result *V3De
if v.Resource != nil {
result, err = V3DecryptPartnerPayNotifyCipherText(v.Resource.Ciphertext, v.Resource.Nonce, v.Resource.AssociatedData, apiV3Key)
if err != nil {
return nil, fmt.Errorf("V3NotifyReq(%s) decrypt cipher text error(%w)", js.MarshalString(v), err)
return nil, fmt.Errorf("V3NotifyReq(%s) decrypt cipher text err(%w)", js.MarshalString(v), err)
}
return result, nil
}
Expand All @@ -414,7 +411,7 @@ func (v *V3NotifyReq) DecryptRefundCipherText(apiV3Key string) (result *V3Decryp
if v.Resource != nil {
result, err = V3DecryptRefundNotifyCipherText(v.Resource.Ciphertext, v.Resource.Nonce, v.Resource.AssociatedData, apiV3Key)
if err != nil {
return nil, fmt.Errorf("V3NotifyReq(%s) decrypt cipher text error(%w)", js.MarshalString(v), err)
return nil, fmt.Errorf("V3NotifyReq(%s) decrypt cipher text err(%w)", js.MarshalString(v), err)
}
return result, nil
}
Expand All @@ -426,7 +423,7 @@ func (v *V3NotifyReq) DecryptPartnerRefundCipherText(apiV3Key string) (result *V
if v.Resource != nil {
result, err = V3DecryptPartnerRefundNotifyCipherText(v.Resource.Ciphertext, v.Resource.Nonce, v.Resource.AssociatedData, apiV3Key)
if err != nil {
return nil, fmt.Errorf("V3NotifyReq(%s) decrypt cipher text error(%w)", js.MarshalString(v), err)
return nil, fmt.Errorf("V3NotifyReq(%s) decrypt cipher text err(%w)", js.MarshalString(v), err)
}
return result, nil
}
Expand All @@ -438,7 +435,7 @@ func (v *V3NotifyReq) DecryptCombineCipherText(apiV3Key string) (result *V3Decry
if v.Resource != nil {
result, err = V3DecryptCombineNotifyCipherText(v.Resource.Ciphertext, v.Resource.Nonce, v.Resource.AssociatedData, apiV3Key)
if err != nil {
return nil, fmt.Errorf("V3NotifyReq(%s) decrypt cipher text error(%w)", js.MarshalString(v), err)
return nil, fmt.Errorf("V3NotifyReq(%s) decrypt cipher text err(%w)", js.MarshalString(v), err)
}
return result, nil
}
Expand All @@ -450,7 +447,7 @@ func (v *V3NotifyReq) DecryptScoreCipherText(apiV3Key string) (result *V3Decrypt
if v.Resource != nil {
result, err = V3DecryptScoreNotifyCipherText(v.Resource.Ciphertext, v.Resource.Nonce, v.Resource.AssociatedData, apiV3Key)
if err != nil {
return nil, fmt.Errorf("V3NotifyReq(%s) decrypt cipher text error(%w)", js.MarshalString(v), err)
return nil, fmt.Errorf("V3NotifyReq(%s) decrypt cipher text err(%w)", js.MarshalString(v), err)
}
return result, nil
}
Expand All @@ -462,7 +459,7 @@ func (v *V3NotifyReq) DecryptScorePermissionCipherText(apiV3Key string) (result
if v.Resource != nil {
result, err = V3DecryptScorePermissionNotifyCipherText(v.Resource.Ciphertext, v.Resource.Nonce, v.Resource.AssociatedData, apiV3Key)
if err != nil {
return nil, fmt.Errorf("V3NotifyReq(%s) decrypt cipher text error(%w)", js.MarshalString(v), err)
return nil, fmt.Errorf("V3NotifyReq(%s) decrypt cipher text err(%w)", js.MarshalString(v), err)
}
return result, nil
}
Expand All @@ -474,7 +471,7 @@ func (v *V3NotifyReq) DecryptProfitShareCipherText(apiV3Key string) (result *V3D
if v.Resource != nil {
result, err = V3DecryptProfitShareNotifyCipherText(v.Resource.Ciphertext, v.Resource.Nonce, v.Resource.AssociatedData, apiV3Key)
if err != nil {
return nil, fmt.Errorf("V3NotifyReq(%s) decrypt cipher text error(%w)", js.MarshalString(v), err)
return nil, fmt.Errorf("V3NotifyReq(%s) decrypt cipher text err(%w)", js.MarshalString(v), err)
}
return result, nil
}
Expand All @@ -486,7 +483,7 @@ func (v *V3NotifyReq) DecryptBusifavorCipherText(apiV3Key string) (result *V3Dec
if v.Resource != nil {
result, err = V3DecryptBusifavorNotifyCipherText(v.Resource.Ciphertext, v.Resource.Nonce, v.Resource.AssociatedData, apiV3Key)
if err != nil {
return nil, fmt.Errorf("V3NotifyReq(%s) decrypt cipher text error(%w)", js.MarshalString(v), err)
return nil, fmt.Errorf("V3NotifyReq(%s) decrypt cipher text err(%w)", js.MarshalString(v), err)
}
return result, nil
}
Expand All @@ -498,7 +495,7 @@ func (v *V3NotifyReq) DecryptParkingInCipherText(apiV3Key string) (result *V3Dec
if v.Resource != nil {
result, err = V3DecryptParkingInNotifyCipherText(v.Resource.Ciphertext, v.Resource.Nonce, v.Resource.AssociatedData, apiV3Key)
if err != nil {
return nil, fmt.Errorf("V3NotifyReq(%s) decrypt cipher text error(%w)", js.MarshalString(v), err)
return nil, fmt.Errorf("V3NotifyReq(%s) decrypt cipher text err(%w)", js.MarshalString(v), err)
}
return result, nil
}
Expand All @@ -510,7 +507,7 @@ func (v *V3NotifyReq) DecryptParkingPayCipherText(apiV3Key string) (result *V3De
if v.Resource != nil {
result, err = V3DecryptParkingPayNotifyCipherText(v.Resource.Ciphertext, v.Resource.Nonce, v.Resource.AssociatedData, apiV3Key)
if err != nil {
return nil, fmt.Errorf("V3NotifyReq(%s) decrypt cipher text error(%w)", js.MarshalString(v), err)
return nil, fmt.Errorf("V3NotifyReq(%s) decrypt cipher text err(%w)", js.MarshalString(v), err)
}
return result, nil
}
Expand All @@ -522,7 +519,7 @@ func (v *V3NotifyReq) DecryptCouponUseCipherText(apiV3Key string) (result *V3Dec
if v.Resource != nil {
result, err = V3DecryptCouponUseNotifyCipherText(v.Resource.Ciphertext, v.Resource.Nonce, v.Resource.AssociatedData, apiV3Key)
if err != nil {
return nil, fmt.Errorf("V3NotifyReq(%s) decrypt cipher text error(%w)", js.MarshalString(v), err)
return nil, fmt.Errorf("V3NotifyReq(%s) decrypt cipher text err(%w)", js.MarshalString(v), err)
}
return result, nil
}
Expand All @@ -534,7 +531,7 @@ func (v *V3NotifyReq) DecryptInvoiceTitleCipherText(apiV3Key string) (result *V3
if v.Resource != nil {
result, err = V3DecryptInvoiceTitleNotifyCipherText(v.Resource.Ciphertext, v.Resource.Nonce, v.Resource.AssociatedData, apiV3Key)
if err != nil {
return nil, fmt.Errorf("V3NotifyReq(%s) decrypt cipher text error(%w)", js.MarshalString(v), err)
return nil, fmt.Errorf("V3NotifyReq(%s) decrypt cipher text err(%w)", js.MarshalString(v), err)
}
return result, nil
}
Expand All @@ -546,7 +543,7 @@ func (v *V3NotifyReq) DecryptInvoiceCipherText(apiV3Key string) (result *V3Decry
if v.Resource != nil {
result, err = V3DecryptInvoiceNotifyCipherText(v.Resource.Ciphertext, v.Resource.Nonce, v.Resource.AssociatedData, apiV3Key)
if err != nil {
return nil, fmt.Errorf("V3NotifyReq(%s) decrypt cipher text error(%w)", js.MarshalString(v), err)
return nil, fmt.Errorf("V3NotifyReq(%s) decrypt cipher text err(%w)", js.MarshalString(v), err)
}
return result, nil
}
Expand All @@ -558,7 +555,7 @@ func (v *V3NotifyReq) DecryptViolationCipherText(apiV3Key string) (result *V3Dec
if v.Resource != nil {
result, err = V3DecryptViolationNotifyCipherText(v.Resource.Ciphertext, v.Resource.Nonce, v.Resource.AssociatedData, apiV3Key)
if err != nil {
return nil, fmt.Errorf("V3NotifyReq(%s) decrypt cipher text error(%w)", js.MarshalString(v), err)
return nil, fmt.Errorf("V3NotifyReq(%s) decrypt cipher text err(%w)", js.MarshalString(v), err)
}
return result, nil
}
Expand All @@ -570,7 +567,19 @@ func (v *V3NotifyReq) DecryptTransferBatchCipherText(apiV3Key string) (result *V
if v.Resource != nil {
result, err = V3DecryptTransferBatchNotifyCipherText(v.Resource.Ciphertext, v.Resource.Nonce, v.Resource.AssociatedData, apiV3Key)
if err != nil {
return nil, fmt.Errorf("V3NotifyReq(%s) decrypt cipher text error(%w)", js.MarshalString(v), err)
return nil, fmt.Errorf("V3NotifyReq(%s) decrypt cipher text err(%w)", js.MarshalString(v), err)
}
return result, nil
}
return nil, errors.New("notify data Resource is nil")
}

// 解密 新版商家转账通知 回调中的加密信息
func (v *V3NotifyReq) DecryptTransferBillsNotifyCipherText(apiV3Key string) (result *V3DecryptTransferBillsResult, err error) {
if v.Resource != nil {
result, err = V3DecryptTransferBillsNotifyCipherText(v.Resource.Ciphertext, v.Resource.Nonce, v.Resource.AssociatedData, apiV3Key)
if err != nil {
return nil, fmt.Errorf("V3NotifyReq(%s) decrypt cipher text err(%w)", js.MarshalString(v), err)
}
return result, nil
}
Expand All @@ -581,10 +590,10 @@ func (v *V3NotifyReq) DecryptTransferBatchCipherText(apiV3Key string) (result *V
// 暂时不推荐此方法,请使用 wechat.V3ParseNotify()
// 解析微信回调请求的参数到 gopay.BodyMap
func V3ParseNotifyToBodyMap(req *http.Request) (bm gopay.BodyMap, err error) {
bs, err := io.ReadAll(io.LimitReader(req.Body, int64(3<<20))) // default 3MB change the size you want;
bs, err := io.ReadAll(io.LimitReader(req.Body, int64(5<<20))) // default 5MB change the size you want;
defer req.Body.Close()
if err != nil {
xlog.Error("err:", err)
xlog.Error("V3ParseNotifyToBodyMap, io.ReadAll, err:", err)
return
}
bm = make(gopay.BodyMap)
Expand Down
Loading

0 comments on commit 9c0d8bf

Please sign in to comment.