diff --git a/README.md b/README.md index aabd714..4c95fb4 100644 --- a/README.md +++ b/README.md @@ -100,21 +100,21 @@ var payment, err = client.ExpressCreatePayment(invoiceNumber, total, currency, c ##### 2. 高级接口 ```Golang -var p = &Payment{} -p.Intent = K_PAYPAL_PAYMENT_INTENT_SALE -p.Payer = &Payer{} +var p = &paypal.Payment{} +p.Intent = paypal.PaymentIntentSale +p.Payer = &paypal.Payer{} p.Payer.PaymentMethod = "paypal" -p.RedirectURLs = &RedirectURLs{} +p.RedirectURLs = &paypal.RedirectURLs{} p.RedirectURLs.CancelURL = "http://www.baidu.com" p.RedirectURLs.ReturnURL = "http://127.0.0.1:9001/paypal" -var transaction = &Transaction{} -p.Transactions = []*Transaction{transaction} +var transaction = &paypal.Transaction{} +p.Transactions = []*paypal.Transaction{transaction} -transaction.Amount = &Amount{} +transaction.Amount = &paypal.Amount{} transaction.Amount.Total = "30.11" transaction.Amount.Currency = "USD" -transaction.Amount.Details = &AmountDetails{} +transaction.Amount.Details = &paypal.AmountDetails{} transaction.Amount.Details.Subtotal = "30.00" transaction.Amount.Details.Tax = "0.07" transaction.Amount.Details.Shipping = "0.03" @@ -126,12 +126,12 @@ transaction.Description = "This is the payment transaction description." transaction.Custom = "EBAY_EMS_90048630024435" transaction.InvoiceNumber = uuid.New() // 随机生成一串 Invoice Number -transaction.PaymentOptions = &PaymentOptions{} +transaction.PaymentOptions = &paypal.PaymentOptions{} transaction.PaymentOptions.AllowedPaymentMethod = "INSTANT_FUNDING_SOURCE" transaction.SoftDescriptor = "ECHI5786786" -transaction.ItemList = &ItemList{} -transaction.ItemList.ShippingAddress = &ShippingAddress{} +transaction.ItemList = &paypal.ItemList{} +transaction.ItemList.ShippingAddress = &paypal.ShippingAddress{} transaction.ItemList.ShippingAddress.RecipientName = "Hello World" transaction.ItemList.ShippingAddress.Line1 = "4thFloor" transaction.ItemList.ShippingAddress.Line2 = "unit#34" @@ -141,8 +141,8 @@ transaction.ItemList.ShippingAddress.PostalCode = "95131" transaction.ItemList.ShippingAddress.Phone = "011862212345678" transaction.ItemList.ShippingAddress.State = "CA" -var i1, i2 = &Item{}, &Item{} -transaction.ItemList.Items = []*Item{i1, i2} +var i1, i2 = &paypal.Item{}, &paypal.Item{} +transaction.ItemList.Items = []*paypal.Item{i1, i2} i1.Name = "hat" i1.Description = "Brown color hat" @@ -191,7 +191,7 @@ http://192.168.192.250:3000/paypal?paymentId=PAY-37A82711YL064934DLB4G3AQ&token= 核准账单支付信息的时候,需要用到 paymentId 和 payerID。 -我们在提供的 ReturnURL 服务中应执行核准账单支付信息的操作。 +我们在提供的 ReturnURL 接口中应执行核准账单支付信息的操作。 ```Golang var payment, err = client.ExecuteApprovedPayment(paymentId, payerID) @@ -224,7 +224,7 @@ var payment, err = client.ExecuteApprovedPayment(paymentId, payerID) ``` 3. 从账单中获取类型为 approval_url 的 URL,浏览器打开进行支付 -4. ReturnURL 服务中进行核准账单支付 +4. ReturnURL 接口中进行核准账单支付 ``` var client = paypal.New(...) diff --git a/dispute.go b/dispute.go index 7c1cdfc..7c37ae9 100644 --- a/dispute.go +++ b/dispute.go @@ -7,15 +7,15 @@ const ( ) // GetDisputeList https://developer.paypal.com/docs/api/customer-disputes/#disputes_get-disputes -func (this *Client) GetDisputeList(param *DisputeListParam) (results *DisputeList, err error) { +func (this *Client) GetDisputeList(param *DisputeListParam) (result *DisputeList, err error) { var api = this.BuildAPI(kDisputesAPI) + param.QueryString() - err = this.doRequestWithAuth(http.MethodGet, api, nil, &results) - return results, err + err = this.doRequestWithAuth(http.MethodGet, api, nil, &result) + return result, err } // GetDisputeDetails https://developer.paypal.com/docs/api/customer-disputes/#disputes_get-dispute -func (this *Client) GetDisputeDetails(disputeId string) (results *Dispute, err error) { +func (this *Client) GetDisputeDetails(disputeId string) (result *Dispute, err error) { var api = this.BuildAPI(kDisputesAPI, disputeId) - err = this.doRequestWithAuth(http.MethodGet, api, nil, &results) - return results, err + err = this.doRequestWithAuth(http.MethodGet, api, nil, &result) + return result, err } diff --git a/dispute_test.go b/dispute_test.go index 265dafe..ad56eb7 100644 --- a/dispute_test.go +++ b/dispute_test.go @@ -1,26 +1,30 @@ -package paypal +package paypal_test import ( - "fmt" + "github.com/smartwalle/paypal" "testing" ) func TestPayPal_GetDisputeList(t *testing.T) { - var param = &DisputeListParam{} + var param = &paypal.DisputeListParam{} param.PageSize = 10 - var results, err = paypal.GetDisputeList(param) + var result, err = client.GetDisputeList(param) if err != nil { t.Fatal(err) } - for _, dispute := range results.Items { - fmt.Println(dispute.DisputeId, dispute.Status) + for _, dispute := range result.Items { + t.Log(dispute.DisputeId, dispute.Status) + } + + for _, link := range result.Links { + t.Log(link.Method, link.Rel, link.Href, link.EncType) } } func TestPayPal_GetDisputeDetails(t *testing.T) { - //var results, err = paypal.GetDisputeDetails("PP-000-042-621-836") - //if err != nil { - // t.Fatal(err) - //} - //fmt.Println(results.DisputeId, results.DisputedTransactions[0].InvoiceNumber) + var result, err = client.GetDisputeDetails("PP-000-042-621-836") + if err != nil { + t.Fatal(err) + } + t.Log(result.DisputeId, result.DisputedTransactions[0].InvoiceNumber) } diff --git a/dispute_type.go b/dispute_type.go index e968e93..df30e0f 100644 --- a/dispute_type.go +++ b/dispute_type.go @@ -8,12 +8,12 @@ import ( type DisputeStatus string const ( - K_DISPUTE_STATUS_OPEN DisputeStatus = "OPEN" - K_DISPUTE_STATUS_WAITING_FOR_BUYER_RESPONSE DisputeStatus = "WAITING_FOR_BUYER_RESPONSE" - K_DISPUTE_STATUS_WAITING_FOR_SELLER_RESPONSE DisputeStatus = "WAITING_FOR_SELLER_RESPONSE" - K_DISPUTE_STATUS_UNDER_REVIEW DisputeStatus = "UNDER_REVIEW" - K_DISPUTE_STATUS_RESOLVED DisputeStatus = "RESOLVED" - K_DISPUTE_STATUS_OTHER DisputeStatus = "OTHER" + DisputeStatusOpen DisputeStatus = "OPEN" + DisputeStatusWaitingForBuyerResponse DisputeStatus = "WAITING_FOR_BUYER_RESPONSE" + DisputeStatusWaitingForSellerResponse DisputeStatus = "WAITING_FOR_SELLER_RESPONSE" + DisputeStatusUnderReview DisputeStatus = "UNDER_REVIEW" + DisputeStatusResolved DisputeStatus = "RESOLVED" + DisputeStatusOther DisputeStatus = "OTHER" ) type Dispute struct { diff --git a/error.go b/error.go index e89fe4e..934c30f 100644 --- a/error.go +++ b/error.go @@ -6,9 +6,9 @@ import ( ) const ( - K_ERR_TYPE_VALIDATION_ERROR = "VALIDATION_ERROR" - K_ERR_TYPE_INSTRUMENT_DECLINED = "INSTRUMENT_DECLINED" - K_ERR_TYPE_PAYMENT_ALREADY_DONE = "PAYMENT_ALREADY_DONE" + ErrTypeValidation = "VALIDATION_ERROR" + ErrTypeInstrumentDeclined = "INSTRUMENT_DECLINED" + ErrTypePaymentAlreadyDone = "PAYMENT_ALREADY_DONE" ) type ResponseError struct { diff --git a/invoice_test.go b/invoice_test.go index 102ef97..356d1e3 100644 --- a/invoice_test.go +++ b/invoice_test.go @@ -1 +1 @@ -package paypal +package paypal_test diff --git a/log.go b/log.go index f97c9f7..c8b8180 100644 --- a/log.go +++ b/log.go @@ -24,7 +24,7 @@ func SetLogger(l Logger) { l = &nilLogger{} } if l.Prefix() == "" { - l.SetPrefix("[dbs] ") + l.SetPrefix("[paypal] ") } logger = l } diff --git a/payment_experience.go b/payment_experience.go index 6856bcb..5d975be 100644 --- a/payment_experience.go +++ b/payment_experience.go @@ -7,17 +7,17 @@ const ( ) // CreateWebExperienceProfile https://developer.paypal.com/docs/api/payment-experience/#web-profile -func (this *Client) CreateWebExperienceProfile(param *WebProfiles) (results *WebProfiles, err error) { +func (this *Client) CreateWebExperienceProfile(param *WebProfiles) (result *WebProfiles, err error) { var api = this.BuildAPI(kWebProfilesAPI) - err = this.doRequestWithAuth(http.MethodPost, api, param, &results) - return results, err + err = this.doRequestWithAuth(http.MethodPost, api, param, &result) + return result, err } // GetWebExperienceProfileList https://developer.paypal.com/docs/api/payment-experience/#web-profiles_get-list -func (this *Client) GetWebExperienceProfileList() (results []*WebProfiles, err error) { +func (this *Client) GetWebExperienceProfileList() (result []*WebProfiles, err error) { var api = this.BuildAPI(kWebProfilesAPI) - err = this.doRequestWithAuth(http.MethodGet, api, nil, &results) - return results, err + err = this.doRequestWithAuth(http.MethodGet, api, nil, &result) + return result, err } // DeleteWebExperienceProfile https://developer.paypal.com/docs/api/payment-experience/#web-profiles_delete @@ -28,10 +28,10 @@ func (this *Client) DeleteWebExperienceProfile(profileId string) (err error) { } // GetWebExperienceProfileDetails https://developer.paypal.com/docs/api/payment-experience/#web-profiles_get -func (this *Client) GetWebExperienceProfileDetails(profileId string) (results *WebProfiles, err error) { +func (this *Client) GetWebExperienceProfileDetails(profileId string) (result *WebProfiles, err error) { var api = this.BuildAPI(kWebProfilesAPI, profileId) - err = this.doRequestWithAuth(http.MethodGet, api, nil, &results) - return results, err + err = this.doRequestWithAuth(http.MethodGet, api, nil, &result) + return result, err } // UpdateWebExperienceProfiles https://developer.paypal.com/docs/api/payment-experience/#web-profiles_update diff --git a/payment_experience_test.go b/payment_experience_test.go index 1b863b7..8f3c33c 100644 --- a/payment_experience_test.go +++ b/payment_experience_test.go @@ -1,41 +1,45 @@ -package paypal +package paypal_test import ( + "github.com/smartwalle/paypal" "testing" ) func TestPayPal_CreateWebExperienceProfile(t *testing.T) { - //var p = &WebProfiles{} - //p.Name = "Test Name" - //p.Presentation = &WebProfilesPresentation{} - //p.Presentation.LogoImage = "" - //p.Presentation.BrandName = "" - // - //var result, err = paypal.CreateWebExperienceProfile(p) - //fmt.Println(err) - //fmt.Println(result.Id, result.Presentation.LogoImage) + var p = &paypal.WebProfiles{} + p.Name = "Test Name" + p.Presentation = &paypal.WebProfilesPresentation{} + p.Presentation.LogoImage = "" + p.Presentation.BrandName = "" + + var result, err = client.CreateWebExperienceProfile(p) + + if err != nil { + t.Fatal(err) + } + t.Log(result.Id, result.Presentation.LogoImage) } func TestPayPal_GetWebExperienceProfileList(t *testing.T) { - //var results, err = paypal.GetWebExperienceProfileList() - //if err != nil { - // t.Fatal(err) - //} - // - //for _, profile := range results { - // fmt.Println(profile.Id, profile.Name) - //} + var result, err = client.GetWebExperienceProfileList() + if err != nil { + t.Fatal(err) + } + + for _, profile := range result { + t.Logf(profile.Id, profile.Name) + } } func TestPayPal_DeleteWebExperienceProfile(t *testing.T) { - //var err = paypal.DeleteWebExperienceProfile("XP-6MSR-MERU-75MJ-SCXL") - //fmt.Println(err) + //var err = client.DeleteWebExperienceProfile("XP-6MSR-MERU-75MJ-SCXL") + //t.Log(err) } func TestPayPal_GetWebhookDetails(t *testing.T) { - //var webhook, err = paypal.GetWebExperienceProfileDetails("XP-BEFQ-A67P-RNXQ-LJLM") - //if err != nil { - // t.Fatal(err) - //} - //fmt.Println(webhook.Id, webhook.Name) + var webhook, err = client.GetWebExperienceProfileDetails("XP-BEFQ-A67P-RNXQ-LJLM") + if err != nil { + t.Fatal(err) + } + t.Log(webhook.Id, webhook.Name) } diff --git a/payments.go b/payments.go index 3c30770..edc51ee 100644 --- a/payments.go +++ b/payments.go @@ -10,17 +10,17 @@ const ( // CreatePayment https://developer.paypal.com/docs/api/payments/#payment // 因为接口返回的 payment 数据只比提交的 payment 数据多了几个字段,所以本接口的参数和返回结果共用同一数据结构。 -func (this *Client) CreatePayment(payment *Payment) (results *Payment, err error) { +func (this *Client) CreatePayment(payment *Payment) (result *Payment, err error) { var api = this.BuildAPI(kPaymentAPI) - err = this.doRequestWithAuth(http.MethodPost, api, payment, &results) - return results, err + err = this.doRequestWithAuth(http.MethodPost, api, payment, &result) + return result, err } -func (this *Client) ExpressCreatePayment(invoiceNumber, total, currency, cancelURL, returnURL string) (results *Payment, err error) { +func (this *Client) ExpressCreatePayment(invoiceNumber, total, currency, cancelURL, returnURL string) (result *Payment, err error) { var p = &Payment{} - p.Intent = K_PAYMENT_INTENT_SALE + p.Intent = PaymentIntentSale p.Payer = &Payer{} - p.Payer.PaymentMethod = K_PAYMENT_METHOD_PAYPAL + p.Payer.PaymentMethod = PaymentMethodPayPal p.RedirectURLs = &RedirectURLs{} p.RedirectURLs.CancelURL = cancelURL p.RedirectURLs.ReturnURL = returnURL @@ -33,52 +33,52 @@ func (this *Client) ExpressCreatePayment(invoiceNumber, total, currency, cancelU transaction.Amount.Total = total transaction.Amount.Currency = currency - results, err = this.CreatePayment(p) - return results, err + result, err = this.CreatePayment(p) + return result, err } // GetPaymentList https://developer.paypal.com/docs/api/payments/#payment_list -func (this *Client) GetPaymentList(param *PaymentListParam) (results *PaymentList, err error) { +func (this *Client) GetPaymentList(param *PaymentListParam) (result *PaymentList, err error) { var api = this.BuildAPI(kPaymentAPI) + param.QueryString() - err = this.doRequestWithAuth(http.MethodGet, api, nil, &results) - return results, err + err = this.doRequestWithAuth(http.MethodGet, api, nil, &result) + return result, err } // GetPaymentDetails https://developer.paypal.com/docs/api/payments/#payment_get -func (this *Client) GetPaymentDetails(paymentId string) (results *Payment, err error) { +func (this *Client) GetPaymentDetails(paymentId string) (result *Payment, err error) { var api = this.BuildAPI(kPaymentAPI, paymentId) - err = this.doRequestWithAuth(http.MethodGet, api, nil, &results) - return results, err + err = this.doRequestWithAuth(http.MethodGet, api, nil, &result) + return result, err } // ExecuteApprovedPayment https://developer.paypal.com/docs/api/payments/#payment_execute // 从回调 URL 中获取 PayerId -func (this *Client) ExecuteApprovedPayment(paymentId, payerId string) (results *Payment, err error) { +func (this *Client) ExecuteApprovedPayment(paymentId, payerId string) (result *Payment, err error) { var p = map[string]interface{}{} p["payer_id"] = payerId var api = this.BuildAPI(kPaymentAPI, paymentId, "execute") - err = this.doRequestWithAuth(http.MethodPost, api, p, &results) - return results, err + err = this.doRequestWithAuth(http.MethodPost, api, p, &result) + return result, err } // GetSaleDetails https://developer.paypal.com/docs/api/payments/#sale_get -func (this *Client) GetSaleDetails(saleId string) (results *Sale, err error) { +func (this *Client) GetSaleDetails(saleId string) (result *Sale, err error) { var api = this.BuildAPI(kSaleAPI, saleId) - err = this.doRequestWithAuth(http.MethodGet, api, nil, &results) - return results, err + err = this.doRequestWithAuth(http.MethodGet, api, nil, &result) + return result, err } // RefundSale https://developer.paypal.com/docs/api/payments/#sale_refund -func (this *Client) RefundSale(saleId string, param *RefundSaleParam) (results *Refund, err error) { +func (this *Client) RefundSale(saleId string, param *RefundSaleParam) (result *Refund, err error) { var api = this.BuildAPI(kSaleAPI, saleId, "/refund") - err = this.doRequestWithAuth(http.MethodPost, api, param, &results) - return results, err + err = this.doRequestWithAuth(http.MethodPost, api, param, &result) + return result, err } // GetRefundDetails https://developer.paypal.com/docs/api/payments/#refund_get -func (this *Client) GetRefundDetails(refundId string) (results *Refund, err error) { +func (this *Client) GetRefundDetails(refundId string) (result *Refund, err error) { var api = this.BuildAPI(kRefundAPI, refundId) - err = this.doRequestWithAuth(http.MethodGet, api, nil, &results) - return results, err + err = this.doRequestWithAuth(http.MethodGet, api, nil, &result) + return result, err } diff --git a/payments_test.go b/payments_test.go index 387694e..4a25429 100644 --- a/payments_test.go +++ b/payments_test.go @@ -1,114 +1,126 @@ -package paypal +package paypal_test import ( + "fmt" + "github.com/smartwalle/paypal" "testing" + "time" ) -//func TestPayPal_ExpressCreatePayment(t *testing.T) { -// var p , err = paypal.ExpressCreatePayment("test_invoice_number", "10", "USD", "http://www.baidu.com", "http://192.168.192.250:3000/paypal") -// if err != nil { -// fmt.Println(err) -// return -// } -// for _, link := range p.Links { -// fmt.Println(link.Method, link.Rel, link.Href) -// } -//} +func TestPayPal_ExpressCreatePayment(t *testing.T) { + var p, err = client.ExpressCreatePayment("test_invoice_number", "10", "USD", "http://www.baidu.com", "http://192.168.192.250:3000/paypal") + if err != nil { + t.Fatal(err) + } + for _, link := range p.Links { + t.Log(link.Method, link.Rel, link.Href) + } +} func TestPayPal_CreatePayment(t *testing.T) { - //var p = &Payment{} - //p.Intent = K_PAYMENT_INTENT_SALE - //p.Payer = &Payer{} - //p.Payer.PaymentMethod = "paypal" - //p.RedirectURLs = &RedirectURLs{} - //p.RedirectURLs.CancelURL = "http://www.baidu.com" - //p.RedirectURLs.ReturnURL = "http://127.0.0.1:9001/paypal" - // - //var transaction = &Transaction{} - //p.Transactions = []*Transaction{transaction} - // - //transaction.Amount = &Amount{} - //transaction.Amount.Total = "30.11" - //transaction.Amount.Currency = "USD" - //transaction.Amount.Details = &AmountDetails{} - //transaction.Amount.Details.Subtotal = "30.00" - //transaction.Amount.Details.Tax = "0.07" - //transaction.Amount.Details.Shipping = "0.03" - //transaction.Amount.Details.HandlingFee = "1.00" - //transaction.Amount.Details.ShippingDiscount = "-1.00" - //transaction.Amount.Details.Insurance = "0.01" - // - //transaction.Description = "This is the payment transaction description." - //transaction.Custom = "EBAY_EMS_90048630024435" - //transaction.InvoiceNumber = uuid.New() - // - //transaction.PaymentOptions = &PaymentOptions{} - //transaction.PaymentOptions.AllowedPaymentMethod = "INSTANT_FUNDING_SOURCE" - //transaction.SoftDescriptor = "ECHI5786786" - // - //transaction.ItemList = &ItemList{} - //transaction.ItemList.ShippingAddress = &ShippingAddress{} - //transaction.ItemList.ShippingAddress.RecipientName = "Hello World" - //transaction.ItemList.ShippingAddress.Line1 = "4thFloor" - //transaction.ItemList.ShippingAddress.Line2 = "unit#34" - //transaction.ItemList.ShippingAddress.City = "SAn Jose" - //transaction.ItemList.ShippingAddress.CountryCode = "US" - //transaction.ItemList.ShippingAddress.PostalCode = "95131" - //transaction.ItemList.ShippingAddress.Phone = "011862212345678" - //transaction.ItemList.ShippingAddress.State = "CA" - // - //var i1, i2 = &Item{}, &Item{} - //transaction.ItemList.Items = []*Item{i1, i2} - // - //i1.Name = "hat" - //i1.Description = "Brown color hat" - //i1.Quantity = "5" - //i1.Price = "3" - //i1.Tax = "0.01" - //i1.SKU = "1" - //i1.Currency = "USD" - // - //i2.Name = "handbag" - //i2.Description = "Black color hand bag" - //i2.Quantity = "1" - //i2.Price = "15" - //i2.Tax = "0.02" - //i2.SKU = "product34" - //i2.Currency = "USD" - // - //p.NoteToPayer = "Contact us for any questions on your order." - // - //var payment, err = paypal.CreatePayment(p) - //if err != nil { - // t.Fatal(err) - //} - // - //if payment != nil { - // fmt.Println("CreatePayment", payment.Id) - //} + var p = &paypal.Payment{} + p.Intent = paypal.PaymentIntentSale + p.Payer = &paypal.Payer{} + p.Payer.PaymentMethod = "paypal" + p.RedirectURLs = &paypal.RedirectURLs{} + p.RedirectURLs.CancelURL = "http://www.baidu.com" + p.RedirectURLs.ReturnURL = "http://127.0.0.1:9001/paypal" + + var transaction = &paypal.Transaction{} + p.Transactions = []*paypal.Transaction{transaction} + + transaction.Amount = &paypal.Amount{} + transaction.Amount.Total = "30.11" + transaction.Amount.Currency = "USD" + transaction.Amount.Details = &paypal.AmountDetails{} + transaction.Amount.Details.Subtotal = "30.00" + transaction.Amount.Details.Tax = "0.07" + transaction.Amount.Details.Shipping = "0.03" + transaction.Amount.Details.HandlingFee = "1.00" + transaction.Amount.Details.ShippingDiscount = "-1.00" + transaction.Amount.Details.Insurance = "0.01" + + transaction.Description = "This is the payment transaction description." + transaction.Custom = "EBAY_EMS_90048630024435" + transaction.InvoiceNumber = fmt.Sprintf("%d", time.Now().UnixMicro()) + + transaction.PaymentOptions = &paypal.PaymentOptions{} + transaction.PaymentOptions.AllowedPaymentMethod = "INSTANT_FUNDING_SOURCE" + transaction.SoftDescriptor = "ECHI5786786" + + transaction.ItemList = &paypal.ItemList{} + transaction.ItemList.ShippingAddress = &paypal.ShippingAddress{} + transaction.ItemList.ShippingAddress.RecipientName = "Hello World" + transaction.ItemList.ShippingAddress.Line1 = "4thFloor" + transaction.ItemList.ShippingAddress.Line2 = "unit#34" + transaction.ItemList.ShippingAddress.City = "SAn Jose" + transaction.ItemList.ShippingAddress.CountryCode = "US" + transaction.ItemList.ShippingAddress.PostalCode = "95131" + transaction.ItemList.ShippingAddress.Phone = "011862212345678" + transaction.ItemList.ShippingAddress.State = "CA" + + var i1, i2 = &paypal.Item{}, &paypal.Item{} + transaction.ItemList.Items = []*paypal.Item{i1, i2} + + i1.Name = "hat" + i1.Description = "Brown color hat" + i1.Quantity = "5" + i1.Price = "3" + i1.Tax = "0.01" + i1.SKU = "1" + i1.Currency = "USD" + + i2.Name = "handbag" + i2.Description = "Black color hand bag" + i2.Quantity = "1" + i2.Price = "15" + i2.Tax = "0.02" + i2.SKU = "product34" + i2.Currency = "USD" + + p.NoteToPayer = "Contact us for any questions on your order." + + var payment, err = client.CreatePayment(p) + if err != nil { + t.Fatal(err) + } + + if payment != nil { + t.Log("CreatePayment", payment.Id) + } + + for _, link := range payment.Links { + t.Log(link.Method, link.Rel, link.Href) + } +} + +func TestPayPal_GetPaymentList(t *testing.T) { + var p = &paypal.PaymentListParam{} + t.Log(client.GetPaymentList(p)) +} + +func TestPayPal_GetPaymentDetails(t *testing.T) { + t.Log(client.GetPaymentDetails("PAY-1SJ16214TY566804MLB26S5I")) +} + +func TestPayPal_ExecuteApprovedPayment(t *testing.T) { + t.Log(client.ExecuteApprovedPayment("PAY-0E809244MY2080201LB26LWI", "XV9HF9K25FB38")) +} + +func TestPayPal_GetSaleDetails(t *testing.T) { + t.Log(client.GetSaleDetails("84E33686SW065691F")) } -//func TestPayPal_GetPaymentList(t *testing.T) { -// var p = &PaymentListParam{} -// fmt.Println(getPayPal().GetPaymentList(p)) -//} -// -//func TestPayPal_GetPaymentDetails(t *testing.T) { -// fmt.Println(getPayPal().GetPaymentDetails("PAY-1SJ16214TY566804MLB26S5I")) -//} -// -//func TestPayPal_ExecuteApprovedPayment(t *testing.T) { -// fmt.Println(getPayPal().ExecuteApprovedPayment("PAY-0E809244MY2080201LB26LWI", "XV9HF9K25FB38")) -//} -// -//func TestPayPal_GetSaleDetails(t *testing.T) { -// fmt.Println(getPayPal().GetSaleDetails("84E33686SW065691F")) -//} - -//func TestPayPal_RefundSale(t *testing.T) { -// fmt.Println(getPayPal().RefundSale("5SW33389HH3038001", "48787589677", "30.11", "USD")) -//} -// -//func TestPayPal_GetRefundDetails(t *testing.T) { -// fmt.Println(getPayPal().GetRefundDetails("7AG891841V2503230")) -//} +func TestPayPal_RefundSale(t *testing.T) { + var p = &paypal.RefundSaleParam{} + p.InvoiceNumber = "48787589677" + p.Amount = &paypal.Amount{} + p.Amount.Total = "30.11" + p.Amount.Currency = "USD" + p.Amount.Total = "30.11" + t.Log(client.RefundSale("5SW33389HH3038001", p)) +} + +func TestPayPal_GetRefundDetails(t *testing.T) { + t.Log(client.GetRefundDetails("7AG891841V2503230")) +} diff --git a/payments_type.go b/payments_type.go index e6cb762..787a2e6 100644 --- a/payments_type.go +++ b/payments_type.go @@ -26,8 +26,8 @@ type PayerInfo struct { type PaymentMethod string const ( - K_PAYMENT_METHOD_PAYPAL PaymentMethod = "paypal" - K_PAYMENT_METHOD_CREDIT_CARD PaymentMethod = "credit_card" + PaymentMethodPayPal PaymentMethod = "paypal" + PaymentMethodCreditCard PaymentMethod = "credit_card" ) type Payer struct { @@ -93,11 +93,11 @@ type ItemList struct { type SaleState string const ( - K_SALE_STATE_COMPLETED SaleState = "completed" - K_SALE_STATE_PARTIALLY_REFUNDED SaleState = "partially_refunded" - K_SALE_STATE_PENDING SaleState = "pending" - K_SALE_STATE_REFUNDED SaleState = "refunded" - K_SALE_STATE_DENIED SaleState = "denied" + SaleStateCompleted SaleState = "completed" + SaleStatePartiallyRefunded SaleState = "partially_refunded" + SaleStatePending SaleState = "pending" + SaleStateRefunded SaleState = "refunded" + SaleStateDenied SaleState = "denied" ) type Sale struct { @@ -151,10 +151,10 @@ type ProcessorResponse struct { type RefundState string const ( - K_REFUND_STATE_PENDING RefundState = "pending" - K_REFUND_STATE_COMPLETED RefundState = "completed" - K_REFUND_STATE_CANCELLED RefundState = "cancelled" - K_REFUND_STATE_FAILED RefundState = "failed" + RefundStatePending RefundState = "pending" + RefundStateCompleted RefundState = "completed" + RefundStateCancelled RefundState = "cancelled" + RefundStateFailed RefundState = "failed" ) type Refund struct { @@ -206,17 +206,17 @@ type RedirectURLs struct { type PaymentIntent string const ( - K_PAYMENT_INTENT_SALE PaymentIntent = "sale" - K_PAYMENT_INTENT_AUTHORIZE PaymentIntent = "authorize" - K_PAYMENT_INTENT_ORDER PaymentIntent = "order" + PaymentIntentSale PaymentIntent = "sale" + PaymentIntentAuthorize PaymentIntent = "authorize" + PaymentIntentOrder PaymentIntent = "order" ) type PaymentState string const ( - K_PAYMENT_STATE_CREATED PaymentState = "created" - K_PAYMENT_STATE_APPROVED PaymentState = "approved" - K_PAYMENT_STATE_FAILED PaymentState = "failed" + PaymentStateCreated PaymentState = "created" + PaymentStateApproved PaymentState = "approved" + PaymentStateFailed PaymentState = "failed" ) type Payment struct { diff --git a/paypal.go b/paypal.go index ede1acc..61811cf 100644 --- a/paypal.go +++ b/paypal.go @@ -5,7 +5,6 @@ import ( "encoding/json" "fmt" "io" - "io/ioutil" "net/http" "net/url" "strings" @@ -83,10 +82,10 @@ func (this *Client) doRequestWithAuth(method, url string, param, result interfac func (this *Client) GetAccessToken() (token *Token, err error) { var api = this.BuildAPI(kGetAccessTokenAPI) - var p = url.Values{} - p.Add("grant_type", "client_credentials") + var param = url.Values{} + param.Add("grant_type", "client_credentials") - req, err := http.NewRequest("POST", api, strings.NewReader(p.Encode())) + req, err := http.NewRequest("POST", api, strings.NewReader(param.Encode())) req.Header.Add("Content-Type", "application/x-www-form-urlencoded") req.SetBasicAuth(this.clientId, this.secret) @@ -100,16 +99,16 @@ func (this *Client) GetAccessToken() (token *Token, err error) { return token, err } -func (this *Client) request(method, url string, payload interface{}) (*http.Request, error) { - var buf io.Reader - if payload != nil { - b, err := json.Marshal(payload) +func (this *Client) request(method, url string, param interface{}) (*http.Request, error) { + var body io.Reader + if param != nil { + data, err := json.Marshal(param) if err != nil { return nil, err } - buf = bytes.NewBuffer(b) + body = bytes.NewBuffer(data) } - return http.NewRequest(method, url, buf) + return http.NewRequest(method, url, body) } func (this *Client) doRequest(req *http.Request, result interface{}) error { @@ -132,7 +131,7 @@ func (this *Client) doRequest(req *http.Request, result interface{}) error { } defer rsp.Body.Close() - data, err = ioutil.ReadAll(rsp.Body) + data, err = io.ReadAll(rsp.Body) if err != nil { return err } diff --git a/paypal_test.go b/paypal_test.go index 7c31c40..da83372 100644 --- a/paypal_test.go +++ b/paypal_test.go @@ -1,14 +1,16 @@ -package paypal +package paypal_test import ( + "github.com/smartwalle/paypal" "os" "testing" ) -var paypal *Client +var client *paypal.Client func TestMain(t *testing.M) { - paypal = New("AS8XSa9JrOJ3rf0kxVqCgRLIlMpgaKhLTShpYxISysR1VpnN6AMLfrvj-upOMuNkXdb9bTIzsFH4umB5", "ECA3_usif2DUgGxgcBTddOKgg2rbjUT7J3B3-Ud9z9y54AK9mYTDDFyadmMLSo1QOiO2rci99FSq1PbZ", false) + client = paypal.New("AS8XSa9JrOJ3rf0kxVqCgRLIlMpgaKhLTShpYxISysR1VpnN6AMLfrvj-upOMuNkXdb9bTIzsFH4umB5", "ECA3_usif2DUgGxgcBTddOKgg2rbjUT7J3B3-Ud9z9y54AK9mYTDDFyadmMLSo1QOiO2rci99FSq1PbZ", false) + paypal.SetLogger(nil) exitCode := t.Run() os.Exit(exitCode) } diff --git a/vault.go b/vault.go index 6f75155..c4a36e3 100644 --- a/vault.go +++ b/vault.go @@ -7,17 +7,17 @@ const ( ) // StoreCreditCard https://developer.paypal.com/docs/api/vault/#credit-cards_create -func (this *Client) StoreCreditCard(param *CreditCard) (results *CreditCard, err error) { +func (this *Client) StoreCreditCard(param *CreditCard) (result *CreditCard, err error) { var api = this.BuildAPI(kCreditCardsAPI) - err = this.doRequestWithAuth(http.MethodPost, api, param, &results) - return results, err + err = this.doRequestWithAuth(http.MethodPost, api, param, &result) + return result, err } // GetCreditCardList https://developer.paypal.com/docs/api/vault/#credit-cards_list -func (this *Client) GetCreditCardList(param *CreditCardListParam) (results *CreditCardList, err error) { +func (this *Client) GetCreditCardList(param *CreditCardListParam) (result *CreditCardList, err error) { var api = this.BuildAPI(kCreditCardsAPI) + param.QueryString() - err = this.doRequestWithAuth(http.MethodGet, api, nil, &results) - return results, err + err = this.doRequestWithAuth(http.MethodGet, api, nil, &result) + return result, err } // DeleteCreditCard https://developer.paypal.com/docs/api/vault/#credit-cards_delete @@ -28,8 +28,8 @@ func (this *Client) DeleteCreditCard(creditCardId string) (err error) { } // GetCreditCardDetails https://developer.paypal.com/docs/api/vault/#credit-cards_delete -func (this *Client) GetCreditCardDetails(creditCardId string) (results *CreditCard, err error) { +func (this *Client) GetCreditCardDetails(creditCardId string) (result *CreditCard, err error) { var api = this.BuildAPI(kCreditCardsAPI, creditCardId) - err = this.doRequestWithAuth(http.MethodGet, api, nil, &results) - return results, err + err = this.doRequestWithAuth(http.MethodGet, api, nil, &result) + return result, err } diff --git a/vault_test.go b/vault_test.go index 0a99806..6e6f58f 100644 --- a/vault_test.go +++ b/vault_test.go @@ -1,54 +1,55 @@ -package paypal +package paypal_test import ( + "github.com/smartwalle/paypal" "testing" ) func TestPayPal_StoreCreditCard(t *testing.T) { - //var p = &CreditCard{} - //p.Number = "4417119669820331" - //p.Type = "visa" - //p.ExpireMonth = "11" - //p.ExpireYear = "2019" - //p.FirstName = "Joe" - //p.LastName = "Shopper" - //p.BillingAddress = &BillingAddress{} - //p.BillingAddress.Line1 = "52 N Main St." - //p.BillingAddress.City = "Johnstown" - //p.BillingAddress.CountryCode = "US" - //p.BillingAddress.PostalCode = "43210" - //p.BillingAddress.State = "OH" - //p.BillingAddress.Phone = "408-334-8890" - // - //var results, err = paypal.StoreCreditCard(p) - //if err != nil { - // t.Fatal(err) - //} - //fmt.Println(results.Id) + var p = &paypal.CreditCard{} + p.Number = "4417119669820331" + p.Type = "visa" + p.ExpireMonth = "11" + p.ExpireYear = "2024" + p.FirstName = "Joe" + p.LastName = "Shopper" + p.BillingAddress = &paypal.BillingAddress{} + p.BillingAddress.Line1 = "52 N Main St." + p.BillingAddress.City = "Johnstown" + p.BillingAddress.CountryCode = "US" + p.BillingAddress.PostalCode = "43210" + p.BillingAddress.State = "OH" + p.BillingAddress.Phone = "408-334-8890" + + var result, err = client.StoreCreditCard(p) + if err != nil { + t.Fatal(err) + } + t.Log(result.Id) } func TestPayPal_GetCreditCardList(t *testing.T) { - //var p = &CreditCardListParam{} - //var results, err = paypal.GetCreditCardList(p) - //if err != nil { - // t.Fatal(err) - //} - //for _, item := range results.Items { - // fmt.Println(item.Id, item.Number) - //} + var p = &paypal.CreditCardListParam{} + var result, err = client.GetCreditCardList(p) + if err != nil { + t.Fatal(err) + } + for _, item := range result.Items { + t.Log(item.Id, item.Number) + } } func TestPayPal_DeleteCreditCard(t *testing.T) { - //var err = paypal.DeleteCreditCard("CARD-9DS52679D6859942PLJ5GNGY") - //if err != nil { - // t.Fatal(err) - //} + var err = client.DeleteCreditCard("CARD-9DS52679D6859942PLJ5GNGY") + if err != nil { + t.Fatal(err) + } } func TestPayPal_GetCreditCardDetails(t *testing.T) { - //var results, err = paypal.GetCreditCardDetails("CARD-74L5398732203540KLJ5GMTQ") - //if err != nil { - // t.Fatal(err) - //} - //fmt.Println(results.Id, results.Number) + var result, err = client.GetCreditCardDetails("CARD-74L5398732203540KLJ5GMTQ") + if err != nil { + t.Fatal(err) + } + t.Log(result.Id, result.Number) } diff --git a/webhook.go b/webhook.go index 02b4c15..fa7fa97 100644 --- a/webhook.go +++ b/webhook.go @@ -4,7 +4,7 @@ import ( "encoding/json" "errors" "fmt" - "io/ioutil" + "io" "net/http" ) @@ -14,7 +14,7 @@ const ( ) // CreateWebhook https://developer.paypal.com/docs/api/webhooks/#webhooks_create -func (this *Client) CreateWebhook(callBackURL string, eventTypeList ...string) (results *Webhook, err error) { +func (this *Client) CreateWebhook(callBackURL string, eventTypeList ...string) (result *Webhook, err error) { var api = this.BuildAPI(kWebHookAPI) var p = &Webhook{} @@ -27,22 +27,22 @@ func (this *Client) CreateWebhook(callBackURL string, eventTypeList ...string) ( p.EventTypes = events p.URL = callBackURL - err = this.doRequestWithAuth(http.MethodPost, api, p, &results) - return results, err + err = this.doRequestWithAuth(http.MethodPost, api, p, &result) + return result, err } // GetWebhookList https://developer.paypal.com/docs/api/webhooks/#webhooks_get-all -func (this *Client) GetWebhookList() (results *WebhookList, err error) { +func (this *Client) GetWebhookList() (result *WebhookList, err error) { var api = this.BuildAPI(kWebHookAPI) - err = this.doRequestWithAuth(http.MethodGet, api, nil, &results) - return results, err + err = this.doRequestWithAuth(http.MethodGet, api, nil, &result) + return result, err } -// GetWebhook https://developer.paypal.com/docs/api/webhooks/#webhooks_get -func (this *Client) GetWebhookDetails(webhookId string) (results *Webhook, err error) { +// GetWebhookDetails https://developer.paypal.com/docs/api/webhooks/#webhooks_get +func (this *Client) GetWebhookDetails(webhookId string) (result *Webhook, err error) { var api = this.BuildAPI(kWebHookAPI, webhookId) - err = this.doRequestWithAuth(http.MethodGet, api, nil, &results) - return results, err + err = this.doRequestWithAuth(http.MethodGet, api, nil, &result) + return result, err } // DeleteWebhook https://developer.paypal.com/docs/api/webhooks/#webhooks_delete @@ -53,16 +53,16 @@ func (this *Client) DeleteWebhook(webhookId string) (err error) { } // verifyWebhookSignature https://developer.paypal.com/docs/api/webhooks/#verify-webhook-signature_post -func (this *Client) verifyWebhookSignature(param *verifyWebhookSignatureParam) (results *verifyWebhookSignatureResponse, err error) { +func (this *Client) verifyWebhookSignature(param *verifyWebhookSignatureParam) (result *verifyWebhookSignatureResponse, err error) { var api = this.BuildAPI(kVerityWebHookSignatureAPI) - err = this.doRequestWithAuth(http.MethodPost, api, param, &results) - return results, err + err = this.doRequestWithAuth(http.MethodPost, api, param, &result) + return result, err } // GetWebhookEvent 用于处理 webbook 回调 func (this *Client) GetWebhookEvent(webhookId string, req *http.Request) (event *Event, err error) { req.ParseForm() - body, err := ioutil.ReadAll(req.Body) + body, err := io.ReadAll(req.Body) if err != nil || len(body) == 0 { return nil, err } @@ -81,25 +81,25 @@ func (this *Client) GetWebhookEvent(webhookId string, req *http.Request) (event } switch event.ResourceType { - case K_EVENT_RESOURCE_TYPE_SALE: + case EventResourceTypeSale: var sale *Sale if err = json.Unmarshal(rawRes, &sale); err != nil { return nil, err } event.Resource = sale - case K_EVENT_RESOURCE_TYPE_REFUND: + case EventResourceTypeRefund: var refund *Refund if err = json.Unmarshal(rawRes, &refund); err != nil { return nil, err } event.Resource = refund - case K_EVENT_RESOURCE_TYPE_INVOICES: + case EventResourceTypeInvoices: var invoice *Invoice if err = json.Unmarshal(rawRes, &invoice); err != nil { return nil, err } event.Resource = invoice - case K_EVENT_RESOURCE_TYPE_DISPUTE: + case EventResourceTypeDispute: var dispute *Dispute if err = json.Unmarshal(rawRes, &dispute); err != nil { return nil, err diff --git a/webhook_server/main.go b/webhook_server/main.go index b2d077d..f22aa45 100644 --- a/webhook_server/main.go +++ b/webhook_server/main.go @@ -19,7 +19,7 @@ func main() { return } switch event.EventType { - case paypal.K_EVENT_TYPE_PAYMENT_SALE_COMPLETED: + case paypal.EventTypePaymentSaleCompleted: var sale = event.Sale() fmt.Println("支付成功", event.Id, event.ResourceType, event.EventType, sale.State, sale.ParentPayment, sale.InvoiceNumber) } diff --git a/webhook_test.go b/webhook_test.go index c9628a6..c6e6b54 100644 --- a/webhook_test.go +++ b/webhook_test.go @@ -1,25 +1,25 @@ -package paypal +package paypal_test import ( "testing" ) func TestPayPal_CreateWebhook(t *testing.T) { - //var webhook, err = paypal.CreateWebhook("https://smartwalle.tk/paypal", "PAYMENT.SALE.COMPLETED") - //if err != nil { - // t.Fatal(err) - //} - //if webhook != nil { - // fmt.Println("CreateWebhook", webhook.Id, webhook.URL) - //} + var webhook, err = client.CreateWebhook("https://smartwalle.tk/paypal", "PAYMENT.SALE.COMPLETED") + if err != nil { + t.Fatal(err) + } + if webhook != nil { + t.Log("CreateWebhook", webhook.Id, webhook.URL) + } } func TestPayPal_GetWebhookList(t *testing.T) { - //var webhookList, err = paypal.GetWebhookList() - //if err != nil { - // t.Fatal(err) - //} - //for _, webhook := range webhookList.Webhooks { - // fmt.Println(webhook.Id, webhook.URL) - //} + var webhookList, err = client.GetWebhookList() + if err != nil { + t.Fatal(err) + } + for _, webhook := range webhookList.Webhooks { + t.Log(webhook.Id, webhook.URL) + } } diff --git a/webhook_type.go b/webhook_type.go index 333d757..406c25d 100644 --- a/webhook_type.go +++ b/webhook_type.go @@ -3,26 +3,26 @@ package paypal type ResourceType string const ( - K_EVENT_RESOURCE_TYPE_INVOICES ResourceType = "invoices" - K_EVENT_RESOURCE_TYPE_SALE ResourceType = "sale" - K_EVENT_RESOURCE_TYPE_REFUND ResourceType = "refund" - K_EVENT_RESOURCE_TYPE_DISPUTE ResourceType = "dispute" + EventResourceTypeInvoices ResourceType = "invoices" + EventResourceTypeSale ResourceType = "sale" + EventResourceTypeRefund ResourceType = "refund" + EventResourceTypeDispute ResourceType = "dispute" ) // https://developer.paypal.com/docs/integration/direct/webhooks/event-names/ const ( - K_EVENT_TYPE_PAYMENT_SALE_COMPLETED = "PAYMENT.SALE.COMPLETED" - K_EVENT_TYPE_PAYMENT_SALE_DENIED = "PAYMENT.SALE.DENIED" - K_EVENT_TYPE_PAYMENT_SALE_PENDING = "PAYMENT.SALE.PENDING" + EventTypePaymentSaleCompleted = "PAYMENT.SALE.COMPLETED" + EventTypePaymentSaleDenied = "PAYMENT.SALE.DENIED" + EventTypePaymentSalePending = "PAYMENT.SALE.PENDING" // 退款成功 - K_EVENT_TYPE_PAYMENT_SALE_REFUNDED = "PAYMENT.SALE.REFUNDED" - K_EVENT_TYPE_PAYMENT_SALE_REVERSED = "PAYMENT.SALE.REVERSED" + EventTypePaymentSaleRefunded = "PAYMENT.SALE.REFUNDED" + EventTypePaymentSaleReversed = "PAYMENT.SALE.REVERSED" // 用户从 paypal 网站申请退款 - K_EVENT_TYPE_CUSTOMER_DISPUTE_CREATED = "CUSTOMER.DISPUTE.CREATED" - K_EVENT_TYPE_CUSTOMER_DISPUTE_RESOLVED = "CUSTOMER.DISPUTE.RESOLVED" - K_EVENT_TYPE_CUSTOMER_DISPUTE_UPDATED = "CUSTOMER.DISPUTE.UPDATED" + EventTypeCustomerDisputeCreated = "CUSTOMER.DISPUTE.CREATED" + EventTypeCustomerDisputeResolved = "CUSTOMER.DISPUTE.RESOLVED" + EventTypeCustomerDisputeUpdated = "CUSTOMER.DISPUTE.UPDATED" ) type EventType struct {