Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature/v1.5.108 #455

Merged
merged 2 commits into from
Jan 22, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Loading