PaymentCenter/app/third/paymentService/psbc/pay_url.go

109 lines
3.0 KiB
Go

package payment
import (
"encoding/hex"
"fmt"
"net/url"
)
// CreatePaymentLink 创建支付链接
func (c *Client) CreatePaymentLink(req PaymentLinkRequest) (*PaymentLinkResponse, error) {
payUrlTemplate := "%s&fromId=include_sb&tysdPayParams=%s&tysdShopid=%s&tysdEncryptKey=%s&returnUrl=%s&showTitleBar=%s"
orderData := map[string]string{
"merchantNo": c.cfg.MchtNo,
"orderInfos": req.ProductName,
"orderNo": req.OrderNo,
"amount": req.Price,
"successUrl": hex.EncodeToString([]byte(c.cfg.SuccessUrl + req.OrderNo)),
"acctType": "2",
"notifyUrl": hex.EncodeToString([]byte(c.cfg.SuccessUrl + req.OrderNo)),
}
signData := map[string]string{
"merchantNo": c.cfg.MchtNo,
"orderNo": req.OrderNo,
"amount": req.Price,
}
sign, enKey, err := c.EncryptMobile(MapToString(orderData), MapToString(signData))
if err != nil {
return nil, fmt.Errorf("加密支付参数失败: %v", err)
}
payUrl := fmt.Sprintf(payUrlTemplate,
req.BackUrl,
sign,
c.cfg.ShopId,
enKey,
url.QueryEscape(c.cfg.ReturnUrl),
c.cfg.ShowTitleBar,
)
plainText := c.cfg.MchtNo + "|" + req.OrderNo + "|" + req.Price
signature := HmacSha256To16(c.cfg.Sha, plainText)
return &PaymentLinkResponse{
OrderNo: req.OrderNo,
NotifyUrl: c.cfg.NotifyUrl,
Sign: signature,
PlainText: plainText,
PayUrl: payUrl,
}, nil
}
// CreatePaymentLinkWithBackUrl 创建支付链接(带 fromId 判断)
func (c *Client) CreatePaymentLinkWithBackUrl(req PaymentLinkRequest) (*PaymentLinkResponse, error) {
var payUrlTemplate string
if len(req.BackUrl) > 0 && (contains(req.BackUrl, "fromId")) {
payUrlTemplate = "%s&tysdPayParams=%s&tysdShopid=%s&tysdEncryptKey=%s&returnUrl=%s&showTitleBar=%s"
} else {
payUrlTemplate = "%s&fromId=include_sb&tysdPayParams=%s&tysdShopid=%s&tysdEncryptKey=%s&returnUrl=%s&showTitleBar=%s"
}
orderData := map[string]string{
"merchantNo": c.cfg.MchtNo,
"orderInfos": req.ProductName,
"orderNo": req.OrderNo,
"amount": req.Price,
"successUrl": hex.EncodeToString([]byte(c.cfg.SuccessUrl + req.OrderNo)),
"acctType": "2",
"notifyUrl": hex.EncodeToString([]byte(c.cfg.SuccessUrl + req.OrderNo)),
}
signData := map[string]string{
"merchantNo": c.cfg.MchtNo,
"orderNo": req.OrderNo,
"amount": req.Price,
}
sign, enKey, err := c.EncryptMobile(MapToString(orderData), MapToString(signData))
if err != nil {
return nil, fmt.Errorf("加密支付参数失败: %v", err)
}
payUrl := fmt.Sprintf(payUrlTemplate,
req.BackUrl,
sign,
c.cfg.ShopId,
enKey,
url.QueryEscape(c.cfg.ReturnUrl),
c.cfg.ShowTitleBar,
)
plainText := c.cfg.MchtNo + "|" + req.OrderNo + "|" + req.Price
signature := HmacSha256To16(c.cfg.Sha, plainText)
return &PaymentLinkResponse{
OrderNo: req.OrderNo,
NotifyUrl: c.cfg.NotifyUrl,
Sign: signature,
PlainText: plainText,
PayUrl: payUrl,
}, nil
}
func contains(s, substr string) bool {
return len(s) > 0 && len(substr) > 0 && (s == substr || len(s) > len(substr) && s[:len(substr)] == substr)
}