Skip to content

Commit 5d3cf71

Browse files
committed
Merge remote-tracking branch 'origin/main'
2 parents 81ef63e + 0ecf176 commit 5d3cf71

10 files changed

+216
-43
lines changed

.github/wx_gopay.png

115 KB
Loading

README.md

+4-7
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
[![Github](https://img.shields.io/github/followers/iGoogle-ink?label=Follow&style=social)](https://github.com/iGoogle-ink)
88
[![Github](https://img.shields.io/github/forks/go-pay/gopay?label=Fork&style=social)](https://github.com/go-pay/gopay/fork)
99

10-
[![Golang](https://img.shields.io/badge/golang-1.20-brightgreen.svg)](https://golang.google.cn)
10+
[![Golang](https://img.shields.io/badge/golang-1.21-brightgreen.svg)](https://golang.google.cn)
1111
[![GoDoc](https://img.shields.io/badge/doc-pkg.go.dev-informational.svg)](https://pkg.go.dev/github.com/go-pay/gopay)
1212
[![Go](https://github.com/go-pay/gopay/actions/workflows/go.yml/badge.svg)](https://github.com/go-pay/gopay/actions/workflows/go.yml)
1313
[![GitHub Release](https://img.shields.io/github/v/release/go-pay/gopay)](https://github.com/go-pay/gopay/releases)
@@ -60,11 +60,8 @@ func main() {
6060

6161
# 三、其他说明
6262

63-
* 如需自定义Log输出,请调用以下方法设置自定义Logger,实现 `xlog.XLogger` 接口即可。
64-
* `xlog.SetDebugLog()`
65-
* `xlog.SetInfoLog()`
66-
* `xlog.SetWarnLog()`
67-
* `xlog.SetErrLog()`
63+
* 如需自定义Log输出,New Client 后,调用 `client.SetLogger()` 方法设置自定义Logger,自定义Logger实现 `xlog.XLogger` interface即可。
64+
6865
* 各支付方式接入,请仔细查看 `xxx_test.go` 使用方式
6966
* `gopay/wechat/v3/client_test.go`
7067
* `gopay/alipay/client_test.go`
@@ -77,7 +74,7 @@ func main() {
7774
* 接入gopay示例项目(可参考接入使用方式):[gopay-platform](https://github.com/go-pay/gopay-platform)
7875
* 有问题请加QQ群(加群验证答案:gopay) 或 加微信好友(备注:gopay开发)拉群。在此,非常感谢提出宝贵意见和反馈问题的同志们!
7976
* 开发过程中,请尽量使用正式环境,1分钱测试法!
80-
* 业余时间接各类业务外包项目开发(前端+后端,架构设计->系统开发->部署运营),如需要加微信联系。
77+
* 有偿承接技术咨询、开发,如需要加微信联系。
8178

8279
QQ群:
8380
<img width="280" height="280" src=".github/qq_gopay.png"/>

alipay/marketing_voucher.go

+92
Original file line numberDiff line numberDiff line change
@@ -286,3 +286,95 @@ func (a *Client) MarketingActivityOrderVoucherAppend(ctx context.Context, bm gop
286286
aliRsp.SignData = signData
287287
return aliRsp, a.autoVerifySignByCert(aliRsp.Sign, signData, signDataErr)
288288
}
289+
290+
// alipay.marketing.activity.ordervoucher.use(同步券核销状态)
291+
// 文档地址:https://opendocs.alipay.com/open/3ffce87f_alipay.marketing.activity.ordervoucher.use
292+
func (a *Client) MarketingActivityOrderVoucherUse(ctx context.Context, bm gopay.BodyMap) (aliRsp *MarketingActivityOrderVoucherUseRsp, err error) {
293+
err = bm.CheckEmptyError("biz_dt", "activity_id", "voucher_code", "trade_channel", "total_fee", "out_biz_no")
294+
if err != nil {
295+
return nil, err
296+
}
297+
var bs []byte
298+
if bs, err = a.doAliPay(ctx, bm, "alipay.marketing.activity.ordervoucher.use"); err != nil {
299+
return nil, err
300+
}
301+
aliRsp = new(MarketingActivityOrderVoucherUseRsp)
302+
if err = json.Unmarshal(bs, aliRsp); err != nil || aliRsp.Response == nil {
303+
return nil, fmt.Errorf("[%w], bytes: %s", gopay.UnmarshalErr, string(bs))
304+
}
305+
if err = bizErrCheck(aliRsp.Response.ErrorResponse); err != nil {
306+
return aliRsp, err
307+
}
308+
signData, signDataErr := a.getSignData(bs, aliRsp.AlipayCertSn)
309+
aliRsp.SignData = signData
310+
return aliRsp, a.autoVerifySignByCert(aliRsp.Sign, signData, signDataErr)
311+
}
312+
313+
// alipay.marketing.activity.ordervoucher.refund(取消券核销状态)
314+
// 文档地址:https://opendocs.alipay.com/open/4682759b_alipay.marketing.activity.ordervoucher.refund?scene=common
315+
func (a *Client) MarketingActivityOrderVoucherRefund(ctx context.Context, bm gopay.BodyMap) (aliRsp *MarketingActivityOrderVoucherRefundRsp, err error) {
316+
err = bm.CheckEmptyError("biz_dt", "activity_id", "voucher_code", "out_biz_no")
317+
if err != nil {
318+
return nil, err
319+
}
320+
var bs []byte
321+
if bs, err = a.doAliPay(ctx, bm, "alipay.marketing.activity.ordervoucher.refund"); err != nil {
322+
return nil, err
323+
}
324+
aliRsp = new(MarketingActivityOrderVoucherRefundRsp)
325+
if err = json.Unmarshal(bs, aliRsp); err != nil || aliRsp.Response == nil {
326+
return nil, fmt.Errorf("[%w], bytes: %s", gopay.UnmarshalErr, string(bs))
327+
}
328+
if err = bizErrCheck(aliRsp.Response.ErrorResponse); err != nil {
329+
return aliRsp, err
330+
}
331+
signData, signDataErr := a.getSignData(bs, aliRsp.AlipayCertSn)
332+
aliRsp.SignData = signData
333+
return aliRsp, a.autoVerifySignByCert(aliRsp.Sign, signData, signDataErr)
334+
}
335+
336+
// alipay.marketing.activity.ordervoucher.query(查询商家券活动)
337+
// 文档地址:https://opendocs.alipay.com/open/51f5946e_alipay.marketing.activity.ordervoucher.query
338+
func (a *Client) MarketingActivityOrderVoucherQuery(ctx context.Context, bm gopay.BodyMap) (aliRsp *MarketingActivityOrderVoucherQueryRsp, err error) {
339+
err = bm.CheckEmptyError("activity_id", "merchant_access_mode")
340+
if err != nil {
341+
return nil, err
342+
}
343+
var bs []byte
344+
if bs, err = a.doAliPay(ctx, bm, "alipay.marketing.activity.ordervoucher.query"); err != nil {
345+
return nil, err
346+
}
347+
aliRsp = new(MarketingActivityOrderVoucherQueryRsp)
348+
if err = json.Unmarshal(bs, aliRsp); err != nil || aliRsp.Response == nil {
349+
return nil, fmt.Errorf("[%w], bytes: %s", gopay.UnmarshalErr, string(bs))
350+
}
351+
if err = bizErrCheck(aliRsp.Response.ErrorResponse); err != nil {
352+
return aliRsp, err
353+
}
354+
signData, signDataErr := a.getSignData(bs, aliRsp.AlipayCertSn)
355+
aliRsp.SignData = signData
356+
return aliRsp, a.autoVerifySignByCert(aliRsp.Sign, signData, signDataErr)
357+
}
358+
359+
// alipay.marketing.activity.ordervoucher.codecount(统计商家券券码数量)
360+
// 文档地址:https://opendocs.alipay.com/open/f6e49e82_alipay.marketing.activity.ordervoucher.codecount
361+
func (a *Client) MarketingActivityOrderVoucherCodeCount(ctx context.Context, bm gopay.BodyMap) (aliRsp *MarketingActivityOrderVoucherCodeCountRsp, err error) {
362+
err = bm.CheckEmptyError("activity_id", "merchant_access_mode")
363+
if err != nil {
364+
return nil, err
365+
}
366+
var bs []byte
367+
if bs, err = a.doAliPay(ctx, bm, "alipay.marketing.activity.ordervoucher.codecount"); err != nil {
368+
return nil, err
369+
}
370+
aliRsp = new(MarketingActivityOrderVoucherCodeCountRsp)
371+
if err = json.Unmarshal(bs, aliRsp); err != nil || aliRsp.Response == nil {
372+
return nil, fmt.Errorf("[%w], bytes: %s", gopay.UnmarshalErr, string(bs))
373+
}
374+
if err = bizErrCheck(aliRsp.Response.ErrorResponse); err != nil {
375+
return aliRsp, err
376+
}
377+
signData, signDataErr := a.getSignData(bs, aliRsp.AlipayCertSn)
378+
aliRsp.SignData = signData
379+
return aliRsp, a.autoVerifySignByCert(aliRsp.Sign, signData, signDataErr)
380+
}

alipay/model_market.go

+65-3
Original file line numberDiff line numberDiff line change
@@ -205,9 +205,37 @@ type MarketingActivityOrderVoucherStopRsp struct {
205205

206206
type MarketingActivityOrderVoucherAppendRsp struct {
207207
Response *MarketingActivityOrderVoucherAppend `json:"alipay_marketing_activity_ordervoucher_append_response"`
208-
AlipayCertSn string `json:"alipay_cert_sn,omitempty"`
209-
SignData string `json:"-"`
210-
Sign string `json:"sign"`
208+
AlipayCertSn string `json:"alipay_cert_sn,omitempty"`
209+
SignData string `json:"-"`
210+
Sign string `json:"sign"`
211+
}
212+
213+
type MarketingActivityOrderVoucherUseRsp struct {
214+
Response *MarketingActivityOrderVoucherUse `json:"alipay_marketing_activity_ordervoucher_use_response"`
215+
AlipayCertSn string `json:"alipay_cert_sn,omitempty"`
216+
SignData string `json:"-"`
217+
Sign string `json:"sign"`
218+
}
219+
220+
type MarketingActivityOrderVoucherRefundRsp struct {
221+
Response *MarketingActivityOrderVoucherRefund `json:"alipay_marketing_activity_ordervoucher_refund_response"`
222+
AlipayCertSn string `json:"alipay_cert_sn,omitempty"`
223+
SignData string `json:"-"`
224+
Sign string `json:"sign"`
225+
}
226+
227+
type MarketingActivityOrderVoucherQueryRsp struct {
228+
Response *MarketingActivityOrderVoucherQuery `json:"alipay_marketing_activity_ordervoucher_query_response"`
229+
AlipayCertSn string `json:"alipay_cert_sn,omitempty"`
230+
SignData string `json:"-"`
231+
Sign string `json:"sign"`
232+
}
233+
234+
type MarketingActivityOrderVoucherCodeCountRsp struct {
235+
Response *MarketingActivityOrderVoucherCodeCount `json:"alipay_marketing_activity_ordervoucher_codecount_response"`
236+
AlipayCertSn string `json:"alipay_cert_sn,omitempty"`
237+
SignData string `json:"-"`
238+
Sign string `json:"sign"`
211239
}
212240

213241
// =========================================================分割=========================================================
@@ -386,6 +414,7 @@ type ActivityBaseInfo struct {
386414
ActivityId string `json:"activity_id"`
387415
ActivityName string `json:"activity_name,omitempty"`
388416
BelongMerchantInfo *BelongMerchantInfo `json:"belong_merchant_info"`
417+
CodeMode string `json:"code_mode,omitempty"`
389418
ActivityOperationStatus string `json:"activity_operation_status,omitempty"`
390419
ActivityStatus string `json:"activity_status"`
391420
ActivityProductType string `json:"activity_product_type,omitempty"`
@@ -865,3 +894,36 @@ type MarketingActivityOrderVoucherStop struct {
865894
type MarketingActivityOrderVoucherAppend struct {
866895
ErrorResponse
867896
}
897+
898+
type MarketingActivityOrderVoucherUse struct {
899+
ErrorResponse
900+
ActivityId string `json:"activity_id"`
901+
VoucherUseDetailResultInfo *VoucherUseDetailResultInfo `json:"voucher_use_detail_result_info"`
902+
}
903+
904+
type VoucherUseDetailResultInfo struct {
905+
VoucherMaxUnUseTimes int `json:"voucher_max_un_use_times"`
906+
}
907+
908+
type MarketingActivityOrderVoucherRefund struct {
909+
ErrorResponse
910+
ActivityId string `json:"activity_id"`
911+
VoucherUseDetailResultInfo *VoucherUseDetailResultInfo `json:"voucher_use_detail_result_info"`
912+
}
913+
914+
type MarketingActivityOrderVoucherQuery struct {
915+
ErrorResponse
916+
ActivityBaseInfo *ActivityBaseInfo `json:"activity_base_info"`
917+
VoucherSendModeInfo *VoucherSendModeInfo `json:"voucher_send_mode_info"`
918+
VoucherDeductInfo *VoucherDeductInfo `json:"voucher_deduct_info"`
919+
VoucherAvailableScopeInfo *VoucherAvailableScopeInfo `json:"voucher_available_scope_info"`
920+
VoucherUseRuleInfo *VoucherUseRuleInfo `json:"voucher_use_rule_info"`
921+
VoucherDisplayPatternInfo *VoucherDisplayPatternInfo `json:"voucher_display_pattern_info"`
922+
VoucherCustomerGuideInfo *VoucherCustomerGuideInfo `json:"voucher_customer_guide_info"`
923+
VoucherInventoryInfo *VoucherInventoryInfo `json:"voucher_inventory_info"`
924+
}
925+
926+
type MarketingActivityOrderVoucherCodeCount struct {
927+
ErrorResponse
928+
SuccessCount int `json:"success_count"`
929+
}

apple/notification_v2_test.go

+4-4
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ func TestDecodeSignedPayload(t *testing.T) {
1717
xlog.Error(err)
1818
return
1919
}
20-
xlog.Color(xlog.CyanBright).Infof("req: %+v", *req)
20+
xlog.Infof("req: %+v", *req)
2121
// decode signedPayload
2222
payload, err := DecodeSignedPayload(req.SignedPayload)
2323
if err != nil {
@@ -30,7 +30,7 @@ func TestDecodeSignedPayload(t *testing.T) {
3030
xlog.Debugf("payload.Version: %s", payload.Version)
3131
xlog.Debugf("payload.Data: %+v", payload.Data)
3232
bs1, _ := json.Marshal(payload)
33-
xlog.Color(xlog.RedBright).Info(string(bs1))
33+
xlog.Info(string(bs1))
3434
/*
3535
{
3636
"notificationType":"DID_RENEW",
@@ -56,7 +56,7 @@ func TestDecodeSignedPayload(t *testing.T) {
5656
}
5757
xlog.Debugf("data.renewalInfo: %+v", renewalInfo)
5858
bs, _ := json.Marshal(renewalInfo)
59-
xlog.Color(xlog.GreenBright).Info(string(bs))
59+
xlog.Info(string(bs))
6060
/*
6161
{
6262
"autoRenewProductId":"com.audaos.audarecorder.vip.m2",
@@ -83,7 +83,7 @@ func TestDecodeSignedPayload(t *testing.T) {
8383
}
8484
xlog.Debugf("data.transactionInfo: %+v", transactionInfo)
8585
bs2, _ := json.Marshal(transactionInfo)
86-
xlog.Color(xlog.YellowBright).Info(string(bs2))
86+
xlog.Info(string(bs2))
8787
/*
8888
{
8989
"appAccountToken":"",

doc/alipay.md

+12-12
Original file line numberDiff line numberDiff line change
@@ -326,20 +326,20 @@ xlog.Infof("%+v", phone)
326326
* 预算追加
327327
* 修改商家券活动发券数量上限接口:`client.MarketingActivityOrderVoucherAppend()`
328328
* 活动发放
329-
* 活动领取咨询接口:TODO:https://opendocs.alipay.com/open/cdf2e908_alipay.marketing.activity.consult
329+
* 活动领取咨询接口:`client.MarketingActivityConsult()`
330330
* 优惠券核销
331-
* 同步券核销状态接口:TODO:https://opendocs.alipay.com/open/3ffce87f_alipay.marketing.activity.ordervoucher.use
332-
* 取消券核销状态接口:TODO:https://opendocs.alipay.com/open/4682759b_alipay.marketing.activity.ordervoucher.refund
331+
* 同步券核销状态接口:`client.MarketingActivityOrderVoucherUse()`
332+
* 取消券核销状态接口:`client.MarketingActivityOrderVoucherRefund()`
333333
* 活动查询
334-
* 查询商家券活动接口:TODO:https://opendocs.alipay.com/open/51f5946e_alipay.marketing.activity.ordervoucher.query
335-
* 查询活动详情接口:TODO:https://opendocs.alipay.com/open/f76b603f_alipay.marketing.activity.query
336-
* 统计商家券券码数量接口:TODO:https://opendocs.alipay.com/open/f6e49e82_alipay.marketing.activity.ordervoucher.codecount
337-
* 条件查询活动列表接口:TODO:https://opendocs.alipay.com/open/55aa8ee8_alipay.marketing.activity.batchquery
338-
* 条件查询用户券接口:TODO:https://opendocs.alipay.com/open/300dff38_alipay.marketing.activity.user.batchqueryvoucher
339-
* 查询用户券详情接口:TODO:https://opendocs.alipay.com/open/abffd3f6_alipay.marketing.activity.user.queryvoucher
340-
* 查询活动可用小程序接口:TODO:https://opendocs.alipay.com/open/634212b2_alipay.marketing.activity.app.batchquery
341-
* 查询活动可用门店接口:TODO:https://opendocs.alipay.com/open/cf4e0873_alipay.marketing.activity.shop.batchquery
342-
* 查询活动适用商品接口:TODO:https://opendocs.alipay.com/open/1bee5767_alipay.marketing.activity.goods.batchquery
334+
* 查询商家券活动接口:`client.MarketingActivityOrderVoucherQuery()`
335+
* 查询活动详情接口:`client.MarketingActivityQuery()`
336+
* 统计商家券券码数量接口:`client.MarketingActivityOrderVoucherCodeCount()`
337+
* 条件查询活动列表接口:`client.MarketingActivityBatchQuery()`
338+
* 条件查询用户券接口:`client.MarketingActivityQueryUserBatchQueryVoucher()`
339+
* 查询用户券详情接口:`client.MarketingActivityQueryUserQueryVoucher()`
340+
* 查询活动可用小程序接口:`client.MarketingActivityQueryAppBatchQuery()`
341+
* 查询活动可用门店接口:`client.MarketingActivityQueryShopBatchQuery()`
342+
* 查询活动适用商品接口:`client.MarketingActivityQueryGoodsBatchQuery()`
343343
* 商家会员卡
344344
* 基础功能
345345
* 会员卡模板创建接口:TODO:https://opendocs.alipay.com/open/b2854ad3_alipay.marketing.card.template.create

doc/apple.md

+4-4
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ xlog.Debugf("payload.NotificationUUID: %s", payload.NotificationUUID)
8787
xlog.Debugf("payload.NotificationVersion: %s", payload.NotificationVersion)
8888
xlog.Debugf("payload.Data: %+v", payload.Data)
8989
bs1, _ := json.Marshal(payload)
90-
xlog.Color(xlog.RedBright).Info(string(bs1))
90+
xlog.Info(string(bs1))
9191
/*
9292
{
9393
"notificationType":"DID_RENEW",
@@ -113,7 +113,7 @@ if err != nil {
113113
}
114114
xlog.Debugf("data.renewalInfo: %+v", renewalInfo)
115115
bs, _ := json.Marshal(renewalInfo)
116-
xlog.Color(xlog.GreenBright).Info(string(bs))
116+
xlog.Info(string(bs))
117117
/*
118118
{
119119
"autoRenewProductId":"com.audaos.audarecorder.vip.m2",
@@ -138,7 +138,7 @@ if err != nil {
138138
}
139139
xlog.Debugf("data.transactionInfo: %+v", transactionInfo)
140140
bs2, _ := json.Marshal(transactionInfo)
141-
xlog.Color(xlog.YellowBright).Info(string(bs2))
141+
xlog.Info(string(bs2))
142142
/*
143143
{
144144
"appAccountToken":"",
@@ -178,4 +178,4 @@ xlog.Color(xlog.YellowBright).Info(string(bs2))
178178

179179
* `apple.VerifyReceipt()` => 验证支付凭证
180180
* `apple.ExtractClaims()` => 解析signedPayload
181-
* `apple.DecodeSignedPayload()` => 解析notification signedPayload
181+
* `apple.DecodeSignedPayload()` => 解析notification signedPayload

paypal/model.go

+20-1
Original file line numberDiff line numberDiff line change
@@ -467,7 +467,26 @@ type Payments struct {
467467
}
468468

469469
type Authorization struct {
470-
ProcessorResponse *Processor `json:"processor_response,omitempty"`
470+
Id string `json:"id,omitempty"`
471+
Status string `json:"status,omitempty"` // CREATED、CAPTURED、DENIED、PARTIALLY_CAPTURED、VOIDED、PENDING
472+
StatusDetails *StatusDetails `json:"status_details,omitempty"`
473+
InvoiceId string `json:"invoice_id,omitempty"`
474+
CustomId string `json:"custom_id,omitempty"`
475+
Links []*Link `json:"links,omitempty"`
476+
Amount *Amount `json:"amount"`
477+
NetworkTransactionReference *NetworkTransactionReference `json:"network_transaction_reference"`
478+
SellerProtection *SellerProtection `json:"seller_protection,omitempty"`
479+
ExpirationTime string `json:"expiration_time,omitempty"`
480+
CreateTime string `json:"create_time,omitempty"`
481+
UpdateTime string `json:"update_time,omitempty"`
482+
ProcessorResponse *Processor `json:"processor_response,omitempty"`
483+
}
484+
485+
type NetworkTransactionReference struct {
486+
Id string `json:"id"`
487+
Date string `json:"date"`
488+
AcquirerReferenceNumber string `json:"acquirer_reference_number"`
489+
Network string `json:"network"`
471490
}
472491

473492
type Processor struct {

paypal/order_test.go

+4
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ func TestCreateOrder(t *testing.T) {
2020
pus = append(pus, item)
2121

2222
bm := make(gopay.BodyMap)
23+
// can be AUTHORIZE
2324
bm.Set("intent", "CAPTURE").
2425
Set("purchase_units", pus).
2526
SetBodyMap("application_context", func(b gopay.BodyMap) {
@@ -131,6 +132,9 @@ func TestOrderAuthorize(t *testing.T) {
131132
xlog.Debugf("ppRsp.Response.PurchaseUnit.Shipping.Address: %+v", v.Shipping.Address)
132133
}
133134
xlog.Debugf("ppRsp.Response.PurchaseUnit.Description: %+v", v.Description)
135+
if v.Payments != nil && v.Payments.Authorizations != nil {
136+
xlog.Debugf("ppRsp.Response.PurchaseUnit.Payments.Authorizations: %+v", v.Payments.Authorizations)
137+
}
134138
}
135139
for _, v := range ppRsp.Response.Links {
136140
xlog.Debugf("ppRsp.Response.Links: %+v", v)

0 commit comments

Comments
 (0)