From 6df638f471adc95fd2af2cfe52d7fd29c7b31687 Mon Sep 17 00:00:00 2001 From: wolter <11@gmail> Date: Thu, 20 Aug 2026 15:28:39 +0800 Subject: [PATCH] =?UTF-8?q?refactor(psbc):=20=E9=87=8D=E6=9E=84=E9=82=AE?= =?UTF-8?q?=E5=82=A8=E6=94=AF=E4=BB=98=E9=85=8D=E7=BD=AE=E4=B8=8E=E5=9B=9E?= =?UTF-8?q?=E8=B0=83=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 移除无用的ShowTitleBar配置项,新增PayUrl配置 2. 调整回调验签逻辑,将订单号转换移至控制器层 3. 重构支付链接生成逻辑,使用配置中的PayUrl构建支付地址 4. 更新测试用例适配新逻辑 --- app/http/controllers/front/psbc.go | 11 +- app/third/paymentService/psbc/pay_url.go | 104 +++++------------ app/third/paymentService/psbc/types.go | 2 +- app/third/paymentService/psbc_service.go | 16 +-- app/third/paymentService/psbc_test.go | 139 +++++++++++++++++++---- 5 files changed, 161 insertions(+), 111 deletions(-) diff --git a/app/http/controllers/front/psbc.go b/app/http/controllers/front/psbc.go index 07a0c4c..2d71bbc 100644 --- a/app/http/controllers/front/psbc.go +++ b/app/http/controllers/front/psbc.go @@ -59,14 +59,14 @@ func PsbcCallback(c *gin.Context) { } psbcConfig.AppID = payChannelModel.AppId - orderId, amountTotal, payerTotal, status, err := paymentService.PsbcVerifyAndParseNotify(bodyStr, psbcConfig) + reqTraceId, amountTotal, payerTotal, status, err := paymentService.PsbcVerifyAndParseNotify(bodyStr, psbcConfig) if err != nil { logger.Error(c, "PsbcCallback-回调数据验签失败", err.Error()) c.String(http.StatusBadRequest, "%s", "fail") return } - logger.Info(c, "PsbcCallback-解析邮储回调结果", fmt.Sprintf("orderId:%d, amountTotal:%d, payerTotal:%d, status:%s", orderId, amountTotal, payerTotal, status)) + logger.Info(c, "PsbcCallback-解析邮储回调结果", fmt.Sprintf("reqTraceId:%s, amountTotal:%d, payerTotal:%d, status:%s", reqTraceId, amountTotal, payerTotal, status)) var orderStatus int var errCode int @@ -86,6 +86,13 @@ func PsbcCallback(c *gin.Context) { return } + orderId, err := strconv.ParseInt(reqTraceId, 10, 64) + if err != nil { + logger.Error(c, "PsbcCallback 发生错误", fmt.Sprintf("订单号转换失败,错误信息:%s", err.Error())) + c.String(http.StatusBadRequest, "%s", "fail") + return + } + notifyResult := thirdpay_notify.NewOrderNotifyWithHandle(orderId, errCode, orderStatus, int(amountTotal), int(payerTotal), msg) notifyResultJson, _ := json.Marshal(notifyResult) diff --git a/app/third/paymentService/psbc/pay_url.go b/app/third/paymentService/psbc/pay_url.go index a371d7b..24e1a6f 100644 --- a/app/third/paymentService/psbc/pay_url.go +++ b/app/third/paymentService/psbc/pay_url.go @@ -8,76 +8,10 @@ import ( "time" ) -// CreatePaymentLink 创建支付链接 -func (c *Client) CreatePaymentLink(req PaymentLinkRequest) (*PaymentLinkResponse, error) { - var payUrlTemplate string - if len(req.BackUrl) > 0 && strings.Contains(req.BackUrl, "?") { - payUrlTemplate = "%s&fromId=include_sb&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)), - "acctType": "2", - "notifyUrl": hex.EncodeToString([]byte(c.cfg.NotifyUrl)), - } - - 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 - hasQuery := len(req.BackUrl) > 0 && strings.Contains(req.BackUrl, "?") - hasFromId := len(req.BackUrl) > 0 && contains(req.BackUrl, "fromId") - if hasFromId { - if hasQuery { - payUrlTemplate = "%s&tysdPayParams=%s&tysdShopid=%s&tysdEncryptKey=%s&returnUrl=%s&showTitleBar=%s" - } else { - payUrlTemplate = "%s?tysdPayParams=%s&tysdShopid=%s&tysdEncryptKey=%s&returnUrl=%s&showTitleBar=%s" - } - } else { - if hasQuery { - payUrlTemplate = "%s&fromId=include_sb&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" - } - } + hasQuery := len(c.cfg.PayUrl) > 0 && strings.Contains(c.cfg.PayUrl, "?") orderData := map[string]string{ "merchantNo": c.cfg.MchtNo, @@ -95,19 +29,37 @@ func (c *Client) CreatePaymentLinkWithBackUrl(req PaymentLinkRequest) (*PaymentL "amount": req.Price, } - sign, enKey, err := c.EncryptMobile(MapToString(orderData), MapToString(signData)) + tysdPayParams, 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, - ) + payUrl := "" + if c.cfg.PayUrl != "" { + payUrl = c.cfg.PayUrl + } + returnUrl := c.cfg.ReturnUrl + if req.BackUrl != "" { + returnUrl = req.BackUrl + } + // 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) diff --git a/app/third/paymentService/psbc/types.go b/app/third/paymentService/psbc/types.go index e9d8136..297bc05 100644 --- a/app/third/paymentService/psbc/types.go +++ b/app/third/paymentService/psbc/types.go @@ -17,13 +17,13 @@ type Config struct { ReturnUrl string // 支付返回地址 SuccessUrl string // 支付成功地址 NotifyUrl string - ShowTitleBar string LoginHost string OrderHost string FileHost string ShopId string Psbcmcc string // 三方服务商标识,如 LSXD、JBZ PrivateKeyCallback string // 邮储响应解密的私钥 + PayUrl string // 支付地址 } // PaymentLinkRequest 生成支付链接请求 diff --git a/app/third/paymentService/psbc_service.go b/app/third/paymentService/psbc_service.go index 82c2879..df143c8 100644 --- a/app/third/paymentService/psbc_service.go +++ b/app/third/paymentService/psbc_service.go @@ -24,12 +24,12 @@ type PsbcPay struct { ReturnUrl string `json:"return_url"` // 支付返回地址 SuccessUrl string `json:"success_url"` // 支付成功地址 NotifyUrl string `json:"notify_url"` // 回调通知地址 - ShowTitleBar string `json:"show_title_bar"` // 是否显示标题栏 LoginHost string `json:"login_host"` // 登录服务地址 OrderHost string `json:"order_host"` // 订单服务地址 FileHost string `json:"file_host"` // 文件服务地址 ShopId string `json:"shop_id"` // 店铺ID Psbcmcc string `json:"psbcmcc"` // 三方服务商标识 + PayUrl string `json:"pay_url"` // 支付地址 } func PsbcInitClient(psbcConfig PsbcPay) *psbc.Client { @@ -45,13 +45,13 @@ func PsbcInitClient(psbcConfig PsbcPay) *psbc.Client { ReturnUrl: psbcConfig.ReturnUrl, SuccessUrl: psbcConfig.SuccessUrl, NotifyUrl: psbcConfig.NotifyUrl, - ShowTitleBar: psbcConfig.ShowTitleBar, LoginHost: psbcConfig.LoginHost, OrderHost: psbcConfig.OrderHost, FileHost: psbcConfig.FileHost, ShopId: psbcConfig.ShopId, Psbcmcc: psbcConfig.Psbcmcc, PrivateKeyCallback: psbcConfig.PrivateKeyCallback, + PayUrl: psbcConfig.PayUrl, } return psbc.NewClient(cfg) } @@ -187,19 +187,13 @@ func PsbcCloseOrder(ctx context.Context, orderCloseRequest OrderCloseRequest) (O }, nil } -func PsbcVerifyAndParseNotify(rawBody string, psbcConfig PsbcPay) (orderId int64, amountTotal int64, payerTotal int64, status string, err error) { +func PsbcVerifyAndParseNotify(rawBody string, psbcConfig PsbcPay) (reqTraceId string, amountTotal int64, payerTotal int64, status string, err error) { psbcClient := PsbcInitClient(psbcConfig) result, err := psbcClient.VerifyAndParseNotify(rawBody) if err != nil { logger.Error(context.Background(), "PsbcVerifyAndParseNotify 发生错误", fmt.Sprintf("验签解密失败,错误信息:%s", err.Error())) - return 0, 0, 0, "", err - } - - orderId, err = strconv.ParseInt(result.ReqTraceId, 10, 64) - if err != nil { - logger.Error(context.Background(), "PsbcVerifyAndParseNotify 发生错误", fmt.Sprintf("订单号转换失败,错误信息:%s", err.Error())) - return 0, 0, 0, "", err + return } if result.TxnAmt != "" { @@ -224,5 +218,5 @@ func PsbcVerifyAndParseNotify(rawBody string, psbcConfig PsbcPay) (orderId int64 status = "NOTPAY" } - return orderId, amountTotal, payerTotal, status, nil + return result.ReqTraceId, amountTotal, payerTotal, status, nil } diff --git a/app/third/paymentService/psbc_test.go b/app/third/paymentService/psbc_test.go index 668030f..837612a 100644 --- a/app/third/paymentService/psbc_test.go +++ b/app/third/paymentService/psbc_test.go @@ -11,6 +11,27 @@ import ( "testing" ) +/* + psbc := PsbcPay{ + MerchantId: "testMerchant001", + MchtNo: "100610100019042", + AppID: "961925472724332544001", + SopPublicKey: "04CABE03249C94BDC8A6A4440DA1B2ADFACF73F4340E5F1B9A76463694B44C2E5600A9BEAA035739383C292CF9F1C4695FAAC7963CD5033D5D647A6B1EBE78EC6A", + PrivateKey: "140c5c68da1829b79d8e4629a8b9548bd694ccc7061fbacb1079aed0e5ac33fa", + PrivateKeyCallback: "1F0E2F085955461A9B87820AFBD513712CAEA89687BE657DE4EC91613BE62D32", + Pubkey: "0447fe9ed13aac6200c92b893ad1289a98437c8404e64b1d2f7c755698a8b8e8acb35c1db2bedc5213c930bdfc10efb0e12269cf6a06877679f114fe5ae9dd4469", + BankKey: "04E0E2E37F11901483CDFBC47F489D87D5D78C55DD7F919B73DEA83007748668B7871A1BA9608F156E25B7D64C7821379BAC1E2C591D5A50FF311D1AAE026C1DAE", + Sha: "636879vrt96t57w6f59", + ReturnUrl: "http://milk.h5.test.86698.cn/#/pages/ycnc/order", + SuccessUrl: "http://milk.h5.test.86698.cn/#/pages/ycnc/orderDetail?isPayBack=true&order_no=", + NotifyUrl: "http://milk.test.api.cdlsxd.cn/api/v1/order/notify", + ShowTitleBar: "true", + LoginHost: "http://wap.dev.psbc.com/sop-h5/biz/crecard/", + OrderHost: "http://wap.dev.psbc.com/sop-h5/biz/unionpay/", + FileHost: "", + ShopId: "LSXD0001", + } +*/ func TestPsbcPay(t *testing.T) { c := context.Background() //解析启动命令 @@ -34,33 +55,59 @@ func TestPsbcPay(t *testing.T) { //data := `{"merchant_id": "your_merchant_id", "mcht_no": "your_mcht_no", "app_id": "your_app_id", "sop_public_key": "your_sop_public_key", "private_key": "your_private_key", "pubkey": "your_pubkey", "bank_key": "your_bank_key", "sha": "your_sha_key", "return_url": "https://example.com/return", "success_url": "https://example.com/success", "notify_url": "https://example.com/notify", "show_title_bar": "1", "login_host": "https://login.example.com", "order_host": "https://order.example.com", "file_host": "https://file.example.com", "shop_id": "your_shop_id"}` - psbc := PsbcPay{ - MerchantId: "testMerchant001", - MchtNo: "100610100019042", - AppID: "961925472724332544001", - SopPublicKey: "04CABE03249C94BDC8A6A4440DA1B2ADFACF73F4340E5F1B9A76463694B44C2E5600A9BEAA035739383C292CF9F1C4695FAAC7963CD5033D5D647A6B1EBE78EC6A", - PrivateKey: "140c5c68da1829b79d8e4629a8b9548bd694ccc7061fbacb1079aed0e5ac33fa", - PrivateKeyCallback: "1F0E2F085955461A9B87820AFBD513712CAEA89687BE657DE4EC91613BE62D32", - Pubkey: "0447fe9ed13aac6200c92b893ad1289a98437c8404e64b1d2f7c755698a8b8e8acb35c1db2bedc5213c930bdfc10efb0e12269cf6a06877679f114fe5ae9dd4469", - BankKey: "04E0E2E37F11901483CDFBC47F489D87D5D78C55DD7F919B73DEA83007748668B7871A1BA9608F156E25B7D64C7821379BAC1E2C591D5A50FF311D1AAE026C1DAE", - Sha: "636879vrt96t57w6f59", - ReturnUrl: "http://milk.h5.test.86698.cn/#/pages/ycnc/order", - SuccessUrl: "http://milk.h5.test.86698.cn/#/pages/ycnc/orderDetail?isPayBack=true&order_no=", - NotifyUrl: "http://milk.test.api.cdlsxd.cn/api/v1/order/notify", - ShowTitleBar: "true", - LoginHost: "http://wap.dev.psbc.com/sop-h5/biz/crecard/", - OrderHost: "http://wap.dev.psbc.com/sop-h5/biz/unionpay/", - FileHost: "", - ShopId: "LSXD0001", - } - data, _ := json.Marshal(psbc) - fmt.Println(string(data)) + //psbc := PsbcPay{ + // MerchantId: "lansexiongdi666", + // MchtNo: "100510102303326", + // AppID: "1204022501096787968001", + // SopPublicKey: "04A3C235C15070E127679628FE024E6C77FFCB1840B4EFBE09D19CBE0EE69BEA231912943984D34C03989771E503DFBB4ECB186F4BBC27764109E63C2875005C81", + // PrivateKey: "00dbdc5f54de98d2281bec34f87f23905610e17af651eae9c16bab68f312b5f2a9", + // PrivateKeyCallback: "7FE05FEB81673ABF0AC4F9EEB99FB03BFE7BE432CA474CB9AAD8E302CAF00766", + // Pubkey: "0454dcb911feb9a892c520f37ebaa11f8c6a552187ac7e57ad0a22356035fc1f7fb09d840def9fa90ee2cd0b0efdb976a597de798e22b81a09684b3d466148e3ea", + // BankKey: "04E842C70157584DE6229FFE56A2CCABDBCFA01A7C5EF24B254638EFB650C9EE196B64788F09777F376F921B038A5BBFF2AFEBA0B81E63EB40DFCDFD1B46819BE1", + // Sha: "463726ztx68n79e3g27", + // ReturnUrl: "http://milk.h5.test.86698.cn/#/pages/ycnc/order", + // SuccessUrl: "http://milk.h5.test.86698.cn/#/pages/ycnc/orderDetail?isPayBack=true&order_no=", + // NotifyUrl: "http://milk.test.api.cdlsxd.cn/api/v1/order/notify", + // ShowTitleBar: "true", + // LoginHost: "https://open.psbc.com/gateway/biz/crecard/", + // OrderHost: "https://open.psbc.com/gateway/biz/unionpay/", + // FileHost: "", + // ShopId: "LSXD0001", + //} + //data, _ := json.Marshal(psbc) + //fmt.Println(string(data)) //err = sonic.Unmarshal([]byte(data), &psbc) //if err != nil { // fmt.Println(err) // return //} + data := `{ + "sha": "463726ztx68n79e3g27", + "app_id": "1204022501096787968001", + "pubkey": "0454dcb911feb9a892c520f37ebaa11f8c6a552187ac7e57ad0a22356035fc1f7fb09d840def9fa90ee2cd0b0efdb976a597de798e22b81a09684b3d466148e3ea", + "mcht_no": "100510102303326", + "psbcmcc": "", + "shop_id": "LSXD0001", + "bank_key": "04E842C70157584DE6229FFE56A2CCABDBCFA01A7C5EF24B254638EFB650C9EE196B64788F09777F376F921B038A5BBFF2AFEBA0B81E63EB40DFCDFD1B46819BE1", + "file_host": "", + "login_host": "https://open.psbc.com/gateway/biz/crecard/", + "notify_url": "https://pay.cdlsxd.cn/pay/front/api/v1/notify/psbc/89351417415", + "order_host": "https://open.psbc.com/gateway/biz/unionpay/", + "return_url": "https://market.86698.cn/hmOrderList", + "merchant_id": "lansexiongdi666", + "private_key": "00dbdc5f54de98d2281bec34f87f23905610e17af651eae9c16bab68f312b5f2a9", + "success_url": "https://market.86698.cn/hmOrderList", + "pay_url": "https://static.mobile-bank.psbc.com/static/back/jump.html/?pageId=50000000&h5Type=9079", + "sop_public_key": "04A3C235C15070E127679628FE024E6C77FFCB1840B4EFBE09D19CBE0EE69BEA231912943984D34C03989771E503DFBB4ECB186F4BBC27764109E63C2875005C81", + "private_key_callback": "7FE05FEB81673ABF0AC4F9EEB99FB03BFE7BE432CA474CB9AAD8E302CAF00766" +}` + psbc := PsbcPay{} + err = json.Unmarshal([]byte(data), &psbc) + if err != nil { + t.Error(err) + } + request := PayOrderRequest{ PayChannelId: 8935141660703064070, OrderId: 374700296052352, @@ -69,10 +116,18 @@ func TestPsbcPay(t *testing.T) { Amount: 100, PayerClientIp: "192.168.110.235", Psbc: psbc, + ReturnUrl: psbc.ReturnUrl, } ////支付 //orderResult := PaymentService(c, request) //t.Log(orderResult) + // + //rsp := payment.PaymentLinkResponse{} + //err = json.Unmarshal([]byte(orderResult.Result), &rsp) + //if err != nil { + // t.Error(err) + //} + //t.Log(rsp) // 查询订单 qreq := PayOrderQueryRequest{ @@ -104,3 +159,45 @@ func TestPsbcPay(t *testing.T) { //closeResutl := OrderClose(c, closeOrder) //t.Log(closeResutl) } + +/* +{"request":"eBz+M1vhBVAWG7G4ec7TR1xPMfwenzhHuGYWLdAC577GQf6NdU4fJAmUdyZkNiAWc29REpSfsrfe\ny3kxcI5M/+dUoeOYLvFvGaxeTR1xPMfwenzhHuGYWLdAC577GQf6NdU4fJORok3HNWQ04+i92bei\nkT3gI+S7tFx3ElAGTR1xPMfwenzhHuGYWLdAC577GQf6NdU4fJQ+yy9LU/YWXJbB9jVQU6DZQ2pd\nWB11aw0wJV32xu1BAZq5Ivlx/1YXMcgC/NH6vLF4J2gbU0d0k7+CVqQFtDVITlOt3wokVIrg2hMd\nD8WT6lUXMIWULiuxEYyLVTbXCV7b/5HnojX8g/qGvvexuQ58tCK/sfbNDeVWxZuKbnFBa/iRbzkZ\nyHtnt7AAvmPCILuydnkuWsLg4fz9f/jf4XOod9lGg9GrXypJonWRR0pmgUUKYmO3lGBNue0gaBhd\nVl4bwVOD7NnjKt1+FJxrIpaWxqL9HpLQxTR1xPMfwenzhHuGYWLdAC577GQf6NdU4fJq78Jnvx50\nWZwR2ASQiXaOBWXiT6bPNgbPiBifozgeij9VoAkz+OBGj1mJl8PaSlkMiuNmPbiFMZtBcdDQODV2\n6GktVnCvrrv/F3y0rR3B3/GqOJISMaWtPBs6Et3xvTR1xPMfwenzhHuGYWLdAC577GQf6NdU4fJZ\n5lGbfCqF4gLGsGM6LFf0JodTdmAfYWXl8TaLyeVTPgx+u6u4u7tl0qEZChp74hnZfl1pdpzcRbna\nD/9qXsCi3Lcjhzqz6AlT2ZNBb4fgMDfn6mo7dSwxA+7r2qXx1ilHLbnhSk1QoRuvk6bzRo7997Z5\ns80c2rWp45tOUVbFe6nvFDJZ8f2B0E/wPHNuhty83lvmkrfaRDwXwV3QVe0sDDSMIhx3mdHaEdLp\nx4PRzlqO4YbgxOaNvjdxFXQaZYIH5MBWd0PPPQ3AG3OmKfwNSroIBluMhVH9HVabqBg3wtsYi2cz\nJos7sSoAJucUb0o+gzeXm9UwxQL1fKY9IwlSYwQG5Vna3I7rn9Qe6O4K9QG9K4xesMTk5EjkJo9Q\ntFRMV+wZc92Q/DhI1JweyTR1xPMfwenzhHuGYWLdAC577GQf6NdU4fJ4NReAIuF/loxzDMVMZhgS\nAUdc6L/AiujoQamfYSmvoAmqjl0ADiilpg==","signature":"7b130dbebf0ac838f54704870288edfe6ecf858923eea47dc5be627071389e2#1fa7390896349fe123f2bfcb58bce2499e8a0ac90e6711b9494b71476c570adb","accessToken":"","encryptKey":"04983F54F2B7C59F9DDF11ADFDDD92D7B82C9132C3A79C32F6C77D325C6E68236E0D7F4D0824033E419CEAC0EC4AA398D2CE7F3B9D681EC93EC27351C39063C44D68A3BAF05BF6F16232C933635D43BFF8262FEA9E3ECD119F0650B9419169ACEF698AC3A479EB5BFAE6BB50DDEB339956"} +*/ +func TestPsbcNotify(t *testing.T) { + + //解析启动命令 + opts := config.GetOptions() + if opts.ShowVersion { + fmt.Printf("%s\ncommit %s\nbuilt on %s\n", server.Version, server.BuildCommit, server.BuildDate) + os.Exit(0) + } + + //加载配置 + opts.ConfFile = "../../../.env" + cf, err := config.Load(opts.ConfFile) + if err != nil { + return + } + //注册日志类服务 + err = logger.Pr.Register(logger.SingletonMain, cf.Log, true) + if err != nil { + return + } + + data := `{"sha": "463726ztx68n79e3g27", "app_id": "1204022501096787968001", "pubkey": "0454dcb911feb9a892c520f37ebaa11f8c6a552187ac7e57ad0a22356035fc1f7fb09d840def9fa90ee2cd0b0efdb976a597de798e22b81a09684b3d466148e3ea", "mcht_no": "100510102303326", "psbcmcc": "", "shop_id": "LSXD0001", "bank_key": "04E842C70157584DE6229FFE56A2CCABDBCFA01A7C5EF24B254638EFB650C9EE196B64788F09777F376F921B038A5BBFF2AFEBA0B81E63EB40DFCDFD1B46819BE1", "file_host": "", "login_host": "https://open.psbc.com/gateway/biz/crecard/", "notify_url": "https://pay.cdlsxd.cn/pay/front/api/v1/notify/psbc/89351417415", "order_host": "https://open.psbc.com/gateway/biz/unionpay/", "return_url": "https://market.86698.cn/hmOrderList", "merchant_id": "lansexiongdi666", "private_key": "00dbdc5f54de98d2281bec34f87f23905610e17af651eae9c16bab68f312b5f2a9", "success_url": "https://market.86698.cn/hmOrderList", "show_title_bar": "true", "sop_public_key": "04A3C235C15070E127679628FE024E6C77FFCB1840B4EFBE09D19CBE0EE69BEA231912943984D34C03989771E503DFBB4ECB186F4BBC27764109E63C2875005C81", "private_key_callback": "7FE05FEB81673ABF0AC4F9EEB99FB03BFE7BE432CA474CB9AAD8E302CAF00766"}` + psbc := PsbcPay{} + err = json.Unmarshal([]byte(data), &psbc) + if err != nil { + t.Error(err) + } + + rowBody := `{"request":"v8CCv7WlLg38TAQdyywtQKJLbiM/Hl2HUyySBRvfwyWPmUr9hmXFqTIlVyeK0otMrj7T8Vpxpql6\nZ4vTSZiOyWX3y2EIXHwuemhNbZlvIQoSdKZ3Vmj1iNHz4B2WWWL/aKulpdciMvTXwfikt7Bpf5BM\nzGEPJPEAr9K2Ocob6hBZr+213N+3ap64UhPbHyhLbVAE61TFMbd10gVf9IGWX2NmbXpqKIumS+Co\ni15IZEcBDKrWnuPd13+6nshmrh3w6L/ig50uIUatEqdVncX6OQN2GoLXBBunx7Nw2yYLUI1cXAME\nYvuVbWiUqOfwx2qkG73iy08YELNinikYWbZiysedkOgi9+Kko0rKf3eMxqCRaGgwl+ozmoEoLmkS\nHIO3tENqttRX8SEoDMugII+E3wnE/Nnu6rJqo1aKDDwOqlxavyoiGWUcp/fsH1UqkeR+qn8clRUd\nf7tIJ8O73fwAzN9DUQ6n1Awo6pdZhb556iGoNy411BoTiwxf+guBuI8SRc8Og9teWYKq2Z/Pk+D6\nYrw14Cjhdxcy89d+grexV6ubvGblotRugxM17Z8QhUXtO6qXm6V4odKd3HZEgRosShQ2GIROMt6t\nGDjsjFIFNrH31DDVyvxIfdru480Q+E54EBTSqVwWH3yYlEEBJf0Ezs4GqcXfB3txbG9oIjTG6x6B\nOCQ1VrfaeuEigKnyVkz5hhp0mA6ZCyC8xvqbT9Njdel8G4m940BwY+P+pzH03BzzMdxpzXaggqiD\n77Flpti8XVWOIpC/GAOyT3XqsOb3Gun1Inmnt3L1t5cd0qmvSHrXXOtxuXIXHr84T1jNd9HWomEE\npKY7FwVoVgsnRRhIIr0DmBvuRl2fGCHMcY73k5/QcL1k2d91Nzy0AFUvsG021VpgdooHCtnrqf40\n/rff8EQmSv7s3n64w9wJ/pFN74JtYPAeWlrzIqFi4xGEVVleWoZz4/MJTQdnFxjSoof/QX16WmWq\nnF/NJ5r+3VSwjaWE+MZ+jVTMx0FQ+HYYdc6JA6fsHnivyOEPQQRxLqGPAaQI2SVQoopy8LH6ps9N\nmyK5WJXHKRHJeEETfu3FVNQQI9//DZ/PJ1z2MyLArKjxpkQ8usXityxNT9KyeTTGqL1KjWnO9RLn\nePK4kZAGzO6jRbF3CXEsVa5SGBUBgfJw/A==","signature":"be1aba3ee42983db0ce429976118a1e6169a83c56f1a9b8575fcf95895dd234f#dd31ed10ad27ad3fa7ca3e6b61d22dc75621fa6bbcfff3828c003853213cdd12","accessToken":"","encryptKey":"047E20D3EF69CCF43148A35A3D828C5BD916DF2F642FBCF4DFC59703C799F314B481234F6109986709756993D1550164CDEF85319BB8CC98672770526AF620E87B04D0D3A8A8C13A04F6789926186E8102393804131BE6802363CDDD58BE61334052920519123BE099DD8229FC48CB8F44"}` + + orderId, amountTotal, payerTotal, status, err := PsbcVerifyAndParseNotify(rowBody, psbc) + if err != nil { + t.Log(err) + return + } + t.Log(orderId, amountTotal, payerTotal, status) + +}