From a05a638ce8714935c18ab0dec873b6f69d142997 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=AD=90=E9=93=AD?= Date: Fri, 12 Jul 2024 13:53:25 +0800 Subject: [PATCH] plugin union pay query func --- plugins/alipay_cpn/internal/alipay_cpn.go | 40 ++++++++++++++++++- .../alipay_cpn/internal/alipay_cpn_test.go | 18 ++++----- plugins/alipay_cpn/internal/po/po.go | 2 +- plugins/alipay_cpn/internal/po/query.go | 5 +++ plugins/alipay_cpn/internal/transform.go | 38 +++++++++++++++--- plugins/alipay_cpn/internal/util.go | 2 +- 6 files changed, 85 insertions(+), 20 deletions(-) diff --git a/plugins/alipay_cpn/internal/alipay_cpn.go b/plugins/alipay_cpn/internal/alipay_cpn.go index 65d1566..81805bc 100644 --- a/plugins/alipay_cpn/internal/alipay_cpn.go +++ b/plugins/alipay_cpn/internal/alipay_cpn.go @@ -16,9 +16,23 @@ const ( CookieValue = "union_pay_cpn" ) +const BaseUri = "https://openapi.alipay.com/gateway.do" + +const ( + orderMethod = "alipay.user.dtbankcust.channelvoucher.send" + queryMethod = "alipay.user.dtbankcust.activityorder.query" +) + type AlipayCpnService struct{} +func (p *AlipayCpnService) configBaseUri(config *proto.Config) { + if config.BaseUri == "" { + config.BaseUri = BaseUri + } +} + func (p *AlipayCpnService) Order(ctx context.Context, request *proto.OrderRequest) (*proto.OrderResponse, error) { + p.configBaseUri(request.Config) conf, err := transConfig(request.Config) if err != nil { return nil, err @@ -27,7 +41,7 @@ func (p *AlipayCpnService) Order(ctx context.Context, request *proto.OrderReques if err != nil { return nil, err } - param, err := paramReq(conf, poReq) + param, err := paramReq(conf, poReq, orderMethod) if err != nil { return nil, err } @@ -45,7 +59,29 @@ func (p *AlipayCpnService) Order(ctx context.Context, request *proto.OrderReques } func (p *AlipayCpnService) Query(ctx context.Context, request *proto.QueryRequest) (*proto.QueryResponse, error) { - return nil, nil + p.configBaseUri(request.Config) + conf, err := transConfig(request.Config) + if err != nil { + return nil, err + } + poReq, err := queryReq(request.Order) + if err != nil { + return nil, err + } + param, err := paramReq(conf, poReq, queryMethod) + if err != nil { + return nil, err + } + uv, err := req(conf, param) + if err != nil { + return nil, err + } + var response po.QueryResp + err = requests.URL(request.Config.BaseUri).BodyForm(uv).ToJSON(&response).Fetch(ctx) + if err != nil { + return nil, fmt.Errorf("请求异常,msg:" + err.Error()) + } + return queryResp(request, response), nil } func (p *AlipayCpnService) Notify(_ context.Context, request *proto.NotifyRequest) (*proto.NotifyResponse, error) { diff --git a/plugins/alipay_cpn/internal/alipay_cpn_test.go b/plugins/alipay_cpn/internal/alipay_cpn_test.go index d8e6fb5..7c1e293 100644 --- a/plugins/alipay_cpn/internal/alipay_cpn_test.go +++ b/plugins/alipay_cpn/internal/alipay_cpn_test.go @@ -8,19 +8,15 @@ import ( "testing" ) -var appId = "2021003168695204" -var appKey = "" -var baseUri = "https://openapi.alipay.com/gateway.do" - var server = &AlipayCpnService{} var config = &proto.Config{ - AppId: appId, - AppKey: appKey, - BaseUri: baseUri, + AppId: "2021004125622196", + AppKey: "", + BaseUri: "", NotifyUrl: "", - Extra: []byte(`{"prk":"MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDAtMuB1mGgbZOETHRlfYefThBO2HjiNcg0kprSgPGQR3gJC6uZ6x2njBrGfLpGsEHjGNnHIjepvbeulD49Tht71kEtKPfsw0LgSgbLDjpxwADctCgnniGHuGmVOeuhuL8hO6JxNt4s+0xPoigmgHFltTKth0Ddc5kqthKmxLx3PJ/JqrzlsELzVkzC+gR/0+epTBTzLUpYzlRt3WhHmxEm8Y9XUk6C1naNXaQNrbrXFzTwnW9MxVj/yJaCoCVcifoVic14lWw3w0cdZ1yM6kcAA9vYAlhIJYc0eg2pAQt/mg/mdseourpa0O01d+2287vKOnOivK0UGqEYsw7d+Q9PAgMBAAECggEBAJ8WostViNNAowAdfhorP8OsVppA68sUS2vbfCU8fjB2UApnsAsppxmi+JfUcJPa/wnUgjV7ciiXjwR5Lci+qsHZZ4U4xTSZHqS7eFA6NtWhhRSvRlcunM/G1qNzZavlMSTmbny4p0LLU3yKikr+zp8AsA3CEzK/NDumhE9ZK53i5WWGwOLQI4yaQoD8XkbFxkWf0yKZiqxj+5UXNnaawfY45ZgDRVtd02hLJQnEYLS4PAt/tUW2I3M+2CJzVcJysry6fd56ZE8JLPVomS3ckS4MsUJkefBTbcJ/idkC5CvnRFqzLjOIOGjDKZqppfn99osilEIhq+UrdmeVZwQEO8ECgYEA+cDxSUjgOkhcU6QlD23B3dmNDWTmJ25RPD55mrhfa6tjInvSiotBwZxwmYKDmBTq/tprf82OjSlR7dQ7oFPSbtde/8tyc/bL/1Jz9/oMB+R2ZxDN3wzCR+rpK3n9YlDv3sR8bYN9q70buTd85SWBk4sdCBb2ZxdFFbn+vAg0ANMCgYEAxYaam+F5IY1/012Y9rikd8IqfZueLGOWOqBUflfsh+ov7Q+xvnJvzk/BLqHU9GvTVCmFK7II1lEFT5tfv8rc6w0y0OOkytx6Ymj/qfcwd8LffKfpRucQSE5i1WyxOvXBZQUZKQSxP0pWrELu9JCE0PPINz+pcFATdH4HV4WoShUCgYARsaSmf347QtMfrdpeTHVWpUoD7+kKVBt3PCnbV0KTWzILyF/zJsiC0fV8Oq3eAWVgptLE3ChEQfAm/Ek5I5cd+S4myyARrSNotEu4/sMJcBsfVCZxrfK5q5/XT64u3/MOgjcafx1RJHWpWpADn/OdI1bsMsxEI3bmgiXU5nPgtwKBgHz/dl3I7L/H7KlUZNVU+Xdz3zHHxevvRYVqKq4dc+h60cNiGCgeART9MZISBVJ73as37zc8ng0KDqNW/tu/Q9hXbN32ATYDGkumiIwFip1vK8CV/bDJzmsDd9X5x5o5JR6JgGeNuaEEqR6v6MnJntMgQoZ7+fzCH92rV3gSc/IVAoGBAK0LkOgsU0Hd9ac0m4yCNPAqt02kSVaq0Q31pzO06/8hrA3+TkCfevKzt0dAwwEpjWHIfLKvJGriRgQSIh2eYloQueM6j0KwNsSkSAXWVaNlA5Twy3cMyYGUauioewksU3a/zhZf6QVsvqC0E5ETxhw/S22PfDnv+y4HzrudQIGo", -"npk":"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAjnsbMbY/KYHhUkVbalbtSMbLFcntTEfqlz+t3bskMUOIvPldsW8U+RQymhjw6AGOQooqMvDqbkWk3kZph9mf56fTbRHYTiyAgNp+yzE9p6DQn3I1k7wT1aaWIX0cn+nJ0n427tYskfDNoG9MojvKLJQjVkU7/CejNy7z9j2BWXU/nPqfavwC/EUQmdx+4aI2IwUX4zOAg5ZbvSbnbBaRVnP9lRVEjMIjfl0LuvBqqvHLEwbQTh2UxlHlK9OWaCQmeD3zPCki7GSugwOXkez61wRIrFluWkpGupcAQRQvjkoxesQQy08ikkEbu5NmiQvybfFny46RBrO3/RnqjKqd/QIDAQAB"}`), + Extra: []byte(`{"prk":"MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC2cF2AxAJP/cQJGPcvzJ5Tt9AQnSzpncTo0sOsge07E9WOi8zIP772lm+ar0cjX9jx8Pf1fJ0hJuzqcsSikC/ZeFWNVmmG4crnwb1NzS/3Ymb22SVKqAjUyjgUkaMQEBRSBAYSTbzwLi9ziggiSvgaIZvUnpQWStcYzhPG91aF2q968vKMd3670b0WwCWSMmWW7dezyqMVikigJCvhSOBfC9A66MciiwtATLpiHBAsRr6IZQ6o9JeH7TPwwLW45QMOXR5VG0xuNj5/8dQmhZGtkckhYEC0v2DrjKkORdfbm4XcvsBsnVhcIVcDu1YkDZHYvhH45r7fUqYfKbgUHH9dAgMBAAECggEBAJUtundxT4bDNYpO3Mk8IvbH5h2/uBrrRDkxJomn0Ckvpb+itvfDkE4oYuf0jVHyrP3hEZCtrfqOzslCwWFAT7Aewq4Iy89cUEND25yDvMYns5QDqYercVU2abcAA3s9+q+51JEg+e7XhTuP0ejgrpEHjFnGtcaoucvxrqBSXXCjJu7l/R/O4gSctTKytTrkZ2vcbaUjVSsDIHE0qtzYinpHlUz8yzxTyhbI2ZHiLiZt3bQVbfPjKiu9H1VLcg4Ty38aP6g1c+nc0aanKiJSjlFWrka2dKB8EySYzt1yqSXHtsFc5BI7lopMTXlQ3f7eZljFt+/QjoGdD3LkRLGsZM0CgYEA74fZQjMeqqGGKxRH1vHkVBQ293VcLZxMh/62VROhWR2JU+UFYmP4zjtu+jnCMAb03kXFoyEJtEShcPoJmW/X5jIR7ukQYYTmlognPOHt4j8n1LP3AxF6m1qhfCPKjX+cbFoYebJtmR4u/pGQQcz6VgsaVTmPLEvBlJaW+C2fBWsCgYEAwvuanPWxHqWhUzGRXQWBOZC4tnS0R43xmnNOPjX0py/X/PwfDvYiMbuV9qRHoHu1dXQ/IfURpOJLp/ibqhTd7TRk6TwVtpnCZ4XJaXZ4wVnIFuH6d78nbEsQODtOwC82OscXvC+foymouM+7HfjXFYh597y+6f3khPQGoTP2+FcCgYBiffWz5tlBSFGm/RvdInHEsNs5PaS9jHtboDzRFtVNk3uYZ5+jKYBxLLchZQaYQQQHMaFmxnr7CQ1pKycvVHHuUcBWALefoco/M5UOz8fFNDrol2eGd3V20/l61iy/qi1j0FgoElpGj8a7Hpe2ttZo8v/M83IPwMbElndVbUzqKQKBgQCSvNlR8JEYWFv9iRs1n1PuJ5zrKw8VnpxJuScUKHTzcU0iBfe1wcRgGyUz1dRV0WPxfceZXZ6msOtxAObdbBDMWBbtdBt/LV4hnIzEgrVEBbZQikZ94ezgUell+DQ+7Ajq2TRimpCQMWTZmPPgDYqImQn5SCGBZWKaMC/hF4NwxwKBgASRF+xP/NUxj3G3TjRHMskFTgtOvzCChZgRXRuvIEd4zEZ1Y29sPSuTHFnJPVPfMDeGmcwPPVDGpMIumRXKJAO6hC9BtnivDnqjtCh16fzoimBeBlaGgg4KWfXT+7BTAPFzlKg4diHoa4Adc4JC+r9Xh++VAMUc3zvH4LWB+Oen", +"npk":"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5sfDbw6kkHXeOSfr7RbrbkV7xHlNE8c5eXNI3ri+UCQLka9aehlnLhI2M1DkzSWFXvHuo5vHlC6set5j25nv+4AKevY1TgAPTMZQjNA3EMXinvBTZVCZnG6Cc3BN5jvAnt31NyTE9JsR5shFL9O6WTFED/WGUaM95kJfVeA1CwWkXUVV2kd1qU5KPAIHKMWsWiu9mSOBVZGd7NWwqfrZq33tiHmqYQ5LkS2JIno3qXukKm/2HIL+Ri1lw7s1c/xE6XalKPiroojK6zLLtrLa3LEGN833NWASrdGi4moYhAPHPZnhwsMr9FfUEsGSvwqdJlAbCtnIdbx3a6mV+sBRxQIDAQAB"}`), } func TestOrder(t *testing.T) { @@ -51,10 +47,10 @@ func TestQuery(t *testing.T) { request := &proto.QueryRequest{ Config: config, Order: &proto.QueryRequest_Order{ - OrderNo: "240403164049635931", + OrderNo: "240403180614988314_80", TradeNo: "", Account: "", - Extra: []byte(`{"origDate":"20240704"}`), + Extra: []byte(`{"phone_id":"","logon_id":"13691105465","activity_id":"ACT873CCV02108400"}`), }, } t.Run("TestQuery", func(t *testing.T) { diff --git a/plugins/alipay_cpn/internal/po/po.go b/plugins/alipay_cpn/internal/po/po.go index 698fa6e..77a443e 100644 --- a/plugins/alipay_cpn/internal/po/po.go +++ b/plugins/alipay_cpn/internal/po/po.go @@ -7,7 +7,7 @@ import ( ) type Param struct { - AppId string `json:"appid" validate:"required"` + AppId string `json:"app_id" validate:"required"` Method string `json:"method" validate:"required"` Format string `json:"format" validate:"required"` Charset string `json:"charset" validate:"required"` diff --git a/plugins/alipay_cpn/internal/po/query.go b/plugins/alipay_cpn/internal/po/query.go index 3b02eb2..e6b1751 100644 --- a/plugins/alipay_cpn/internal/po/query.go +++ b/plugins/alipay_cpn/internal/po/query.go @@ -14,6 +14,11 @@ type QueryReq struct { } type QueryResp struct { + Data QueryRespData `json:"alipay_user_dtbankcust_activityorder_query_response"` + Sign string `json:"sign"` +} + +type QueryRespData struct { Code vo.Code `json:"code"` Msg string `json:"msg"` SubCode string `json:"subCode"` diff --git a/plugins/alipay_cpn/internal/transform.go b/plugins/alipay_cpn/internal/transform.go index 34a803a..294ef28 100644 --- a/plugins/alipay_cpn/internal/transform.go +++ b/plugins/alipay_cpn/internal/transform.go @@ -31,7 +31,7 @@ func transConfig(config *proto.Config) (*Config, error) { }, nil } -func paramReq(config *Config, req po.Req) (*po.Param, error) { +func paramReq(config *Config, req po.Req, method string) (*po.Param, error) { if err := req.Validate(); err != nil { return nil, err } @@ -39,7 +39,7 @@ func paramReq(config *Config, req po.Req) (*po.Param, error) { Timestamp: time.Now().Format("2006-01-02 15:04:05"), Version: vo.Version, AppId: config.Config.AppId, - Method: "alipay.user.dtbankcust.channelvoucher.send", + Method: method, Format: vo.Format, Charset: vo.Charset, SignType: vo.SignType, @@ -83,12 +83,40 @@ func orderResp(request *proto.OrderRequest, resp po.OrderResp) *proto.OrderRespo } } -func queryReq(in *proto.QueryRequest, chNlId string) *po.QueryReq { - return nil +func queryReq(in *proto.QueryRequest_Order) (*po.QueryReq, error) { + type Extra struct { + LogonId string `json:"logon_id"` + PhoneId string `json:"phone_id"` + ActivityID string `json:"activity_id"` + } + var extra Extra + if in.Extra != nil { + err := json.Unmarshal(in.Extra, &extra) + if err != nil { + return nil, fmt.Errorf("order extra json unmarshal error: %v", err) + } + } + return &po.QueryReq{ + ActivityOrderId: in.TradeNo, + OutBizNo: in.OrderNo, + UserId: in.Account, + LogonId: extra.LogonId, + PhoneId: extra.PhoneId, + ActivityID: extra.ActivityID, + }, nil } func queryResp(request *proto.QueryRequest, resp po.QueryResp) *proto.QueryResponse { - return nil + data, _ := json.Marshal(resp) + return &proto.QueryResponse{ + Result: &proto.Result{ + Status: resp.Data.Status.GetOrderStatus(), + OrderNo: request.Order.OrderNo, + TradeNo: request.Order.TradeNo, + Message: resp.Data.Msg, + Data: data, + }, + } } func notifyReq(in *proto.NotifyRequest) *po.Notify { diff --git a/plugins/alipay_cpn/internal/util.go b/plugins/alipay_cpn/internal/util.go index 5d7c787..efb8586 100644 --- a/plugins/alipay_cpn/internal/util.go +++ b/plugins/alipay_cpn/internal/util.go @@ -19,7 +19,7 @@ import ( func req(config *Config, req *po.Param) (url.Values, error) { var strToBeSigned strings.Builder uv := url.Values{} - kvRows := utils.SortStruct(req) + kvRows := utils.SortStructJsonTag(req) for _, kv := range kvRows { if kv.Key == "sign" { continue