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

105 lines
2.6 KiB
Go

package payment
import (
"encoding/hex"
"fmt"
"net/url"
"strings"
"time"
)
// CreatePaymentLinkWithBackUrl 创建支付链接(带 fromId 判断)
func (c *Client) CreatePaymentLinkWithBackUrl(req PaymentLinkRequest) (*PaymentLinkResponse, error) {
returnUrl := c.cfg.ReturnUrl
if req.BackUrl != "" {
returnUrl = req.BackUrl
}
hasQuery := len(c.cfg.PayUrl) > 0 && strings.Contains(c.cfg.PayUrl, "?")
orderData := map[string]string{
"merchantNo": c.cfg.MchtNo,
"orderInfos": req.ProductName,
"orderNo": req.OrderNo,
"amount": req.Price,
"successUrl": hex.EncodeToString([]byte(returnUrl)),
"acctType": "2",
"notifyUrl": hex.EncodeToString([]byte(c.cfg.NotifyUrl)),
}
signData := map[string]string{
"merchantNo": c.cfg.MchtNo,
"orderNo": req.OrderNo,
"amount": req.Price,
}
tysdPayParams, enKey, err := c.EncryptMobile(MapToString(orderData), MapToString(signData))
if err != nil {
return nil, fmt.Errorf("加密支付参数失败: %v", err)
}
payUrl := ""
if c.cfg.PayUrl != "" {
payUrl = c.cfg.PayUrl
}
// https://static.mobile-bank.psbc.com/static/back/jump.html/?pageId=50000000&h5Type=9079& tysdPayParams=密文&tysdShopid=XXX & tysdEncryptKey =XXX& returnUrl =XXX
if hasQuery {
payUrl = fmt.Sprintf("%s&tysdPayParams=%s&tysdShopid=%s&tysdEncryptKey=%s&returnUrl=%s",
payUrl,
tysdPayParams,
c.cfg.ShopId,
enKey,
url.QueryEscape(returnUrl),
)
} else {
payUrl = fmt.Sprintf("%s?tysdPayParams=%s&tysdShopid=%s&tysdEncryptKey=%s&returnUrl=%s",
payUrl,
tysdPayParams,
c.cfg.ShopId,
enKey,
url.QueryEscape(returnUrl),
)
}
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 && strings.Contains(s, substr)
}
// CreateHandCodePayParams 生成 handCodePay 插件参数
func (c *Client) CreateHandCodePayParams(req PaymentLinkRequest) (*HandCodePayResponse, error) {
plainText := c.cfg.MchtNo + "|" + req.OrderNo + "|" + req.Price
signature := HmacSha256To16(c.cfg.Sha, plainText)
txnDt := time.Now().Format("2006-01-02")
plain := fmt.Sprintf("TermSsn=%s|MercCode=%s|TranAmt=%s|MercUrl=%s|psbcmcc=%s|BackLink=%s|TxnDt=%s",
req.OrderNo,
c.cfg.MchtNo,
req.Price,
c.cfg.NotifyUrl,
c.cfg.Psbcmcc,
req.BackUrl,
txnDt,
)
return &HandCodePayResponse{
Plain: plain,
Sign: signature,
PlainText: plainText,
Signature: "",
}, nil
}