|
- package pay
-
- import (
- "code.fnuoos.com/go_rely_warehouse/zyos_go_pay.git/md"
- zhios_pay_utils "code.fnuoos.com/go_rely_warehouse/zyos_go_pay.git/utils"
- "encoding/json"
- "errors"
- "fmt"
- "github.com/iGoogle-ink/gopay"
- "github.com/iGoogle-ink/gopay/alipay"
- "github.com/iGoogle-ink/gopay/pkg/util"
- "github.com/iGoogle-ink/gopay/pkg/xhttp"
- "github.com/iGoogle-ink/gopay/pkg/xlog"
- "time"
- )
-
- const (
- baseUrl = "https://openapi.alipay.com/gateway.do"
- sandboxBaseUrl = "https://openapi.alipaydev.com/gateway.do"
- baseUrlUtf8 = "https://openapi.alipay.com/gateway.do?charset=utf-8"
- sandboxBaseUrlUtf8 = "https://openapi.alipaydev.com/gateway.do?charset=utf-8"
- )
-
- func Comm(args map[string]string) *alipay.Client {
- paySet := AlipayCofing(args)
- if args["private_key"] == "" || args["app_id"] == "" {
- return nil
- }
- //初始化支付宝客户端
- // appID 是在支付宝申请的APPID
- // priKey 是支付宝私钥
- // code 支付宝授权码
- client := alipay.NewClient(args["app_id"], args["private_key"], true)
- client.DebugSwitch = gopay.DebugOn
- //判断密钥的类型
- rsa_type := alipay.RSA2
- pkcs_type := alipay.PKCS1
- if args["rsa"] == "1" {
- rsa_type = alipay.RSA
- }
- if args["pkcs"] == "1" {
- pkcs_type = alipay.PKCS8
- }
- if paySet.PayAliUseType == "1" {
- rsa_type = alipay.RSA2
- pkcs_type = alipay.PKCS8
- }
- //配置公共参数
- client.SetCharset("utf-8").
- SetSignType(rsa_type).
- SetPrivateKeyType(pkcs_type)
- //新支付宝支付
- if paySet.PayAliUseType == "1" {
- client.SetAppCertSN(paySet.PayAppCertSn)
- aliPayRootCertSN := "687b59193f3f462dd5336e5abf83c5d8_02941eef3187dddf3d3b83462e1dfcf6"
- client.SetAliPayRootCertSN(aliPayRootCertSN)
- client.SetAliPayPublicCertSN(paySet.PayAlipayrsaPublicKey)
- }
- client.IsProd = true
- fmt.Println(client)
- return client
-
- }
- func OpenAuthTokenApp(args map[string]string) (*alipay.SystemOauthTokenResponse, error) {
- client := Comm(args)
- if client == nil {
- return nil, errors.New("获取失败")
- }
- //请求参数
- body := make(gopay.BodyMap)
- body.Set("grant_type", "authorization_code")
- body.Set("code", args["code"])
-
- payParam, err := client.SystemOauthToken(body)
- if err != nil {
- return nil, err
- }
- return payParam, nil
- }
- func UserInfoShare(args map[string]string) (*alipay.UserInfoShareResponse, error) {
- client := Comm(args)
- client.AuthToken = args["auth_token"]
- if client == nil {
- return nil, errors.New("获取失败")
- }
- payParam, err := client.UserInfoShare()
- if err != nil {
- return nil, err
- }
- return payParam, nil
- }
-
- func CreditagreementSign(args map[string]string) (string, error) {
- client := Comm(args)
- client.AppAuthToken = args["app_auth_token"]
- if client == nil {
- return "", errors.New("获取失败")
- }
- //请求参数
- bm := make(gopay.BodyMap)
- // biz_content
- bm.SetBodyMap("biz_content", func(bz gopay.BodyMap) {
- bz.Set("out_agreement_no", args["out_agreement_no"])
- bz.Set("zm_service_id", args["zm_service_id"])
- bz.Set("category_id", args["category_id"])
- bz.Set("return_back_link", args["return_back_link"])
- })
-
- aliPsp := ""
- bs, err := PostAliPayAPISelfV2(client, bm, "zhima.credit.payafteruse.creditagreement.sign", &aliPsp)
- if err != nil {
- xlog.Error(err)
- return "", err
- }
- return zhios_pay_utils.AnyToString(bs), nil
- }
- func CreditagreementQuery(args map[string]string) (*md.ZhimaCreditPayafteruseCreditagreementQuery, error) {
- client := Comm(args)
- client.AppAuthToken = args["app_auth_token"]
- if client == nil {
- return nil, errors.New("获取失败")
- }
- //请求参数
- bm := make(gopay.BodyMap)
- // biz_content
- bm.SetBodyMap("biz_content", func(bz gopay.BodyMap) {
- bz.Set("out_agreement_no", args["out_agreement_no"])
- })
-
- var aliPsp md.ZhimaCreditPayafteruseCreditagreementQuery
- bs, err := PostAliPayAPISelfV2(client, bm, "zhima.credit.payafteruse.creditagreement.query", &aliPsp)
- if err != nil {
- xlog.Error(err)
- return nil, err
- }
- res := bs.(*md.ZhimaCreditPayafteruseCreditagreementQuery)
- return res, nil
- }
-
- //信用下单
- func CreditagreementOrder(args map[string]string) (*md.ZhimaCreditPayafteruseCreditbizorderOrder, error) {
- client := Comm(args)
- client.AppAuthToken = args["app_auth_token"]
- if client == nil {
- return nil, errors.New("获取失败")
- }
- //请求参数
- bm := make(gopay.BodyMap)
- // biz_content
- bm.SetBodyMap("biz_content", func(bz gopay.BodyMap) {
- bz.Set("out_order_no", args["out_order_no"])
- bz.Set("credit_agreement_id", args["credit_agreement_id"])
- bz.Set("category_id", args["category_id"])
- bz.Set("order_amount", args["order_amount"])
- bz.Set("amount_type", args["amount_type"])
- bz.Set("subject", args["subject"])
- })
-
- var aliPsp md.ZhimaCreditPayafteruseCreditbizorderOrder
- bs, err := PostAliPayAPISelfV2(client, bm, "zhima.credit.payafteruse.creditbizorder.order", &aliPsp)
- if err != nil {
- xlog.Error(err)
- return nil, err
- }
- res := bs.(*md.ZhimaCreditPayafteruseCreditbizorderOrder)
- return res, nil
- }
-
- //查询信用订单
- func CreditagreementOrderQuery(args map[string]string) (*md.ZhimaCreditPayafteruseCreditbizorderQuery, error) {
- client := Comm(args)
- client.AppAuthToken = args["app_auth_token"]
- if client == nil {
- return nil, errors.New("获取失败")
- }
- //请求参数
- bm := make(gopay.BodyMap)
- // biz_content
- bm.SetBodyMap("biz_content", func(bz gopay.BodyMap) {
- bz.Set("credit_biz_order_id", args["credit_biz_order_id"])
- })
-
- var aliPsp md.ZhimaCreditPayafteruseCreditbizorderQuery
- bs, err := PostAliPayAPISelfV2(client, bm, "zhima.credit.payafteruse.creditbizorder.query", &aliPsp)
- if err != nil {
- xlog.Error(err)
- return nil, err
- }
- res := bs.(*md.ZhimaCreditPayafteruseCreditbizorderQuery)
- return res, nil
- }
-
- //转账
- func AlipayFundTransUniTransfer(args map[string]string) (*md.AlipayFundTransUniTransfer, error) {
- client := Comm(args)
- if client == nil {
- return nil, errors.New("获取失败")
- }
- //请求参数
- bm := make(gopay.BodyMap)
- // biz_content
- payeeInfo := map[string]string{
- "identity": args["identity"],
- "identity_type": args["identity_type"],
- "name": args["name"],
- }
- bm.SetBodyMap("biz_content", func(bz gopay.BodyMap) {
- bz.Set("out_biz_no", args["out_biz_no"])
- bz.Set("trans_amount", args["trans_amount"])
- bz.Set("product_code", args["product_code"])
- bz.Set("biz_scene", args["biz_scene"])
- bz.Set("order_title", args["order_title"])
- bz.Set("payee_info", payeeInfo)
- })
-
- var aliPsp md.AlipayFundTransUniTransfer
- bs, err := PostAliPayAPISelfV2(client, bm, "alipay.fund.trans.uni.transfer", &aliPsp)
- if err != nil {
- xlog.Error(err)
- return nil, err
- }
- res := bs.(*md.AlipayFundTransUniTransfer)
- return res, nil
- }
-
- //扣款
- func AlipayTradePay(args map[string]string) (*md.AlipayTradePay, error) {
- client := Comm(args)
- if args["notify_url"] != "" {
- client.NotifyUrl = args["notify_url"]
- }
- if client == nil {
- return nil, errors.New("获取失败")
- }
- //请求参数
- bm := make(gopay.BodyMap)
- // biz_content
- extendParams := map[string]string{
- "creditTradeScene": args["creditTradeScene"],
- }
- bm.SetBodyMap("biz_content", func(bz gopay.BodyMap) {
- bz.Set("out_trade_no", args["out_trade_no"])
- bz.Set("is_async_pay", args["is_async_pay"])
- bz.Set("total_amount", args["total_amount"])
- bz.Set("auth_code", args["auth_code"])
- bz.Set("product_code", args["product_code"])
- bz.Set("scene", args["scene"])
- bz.Set("subject", args["subject"])
- bz.Set("extend_params", extendParams)
- })
- var aliPsp md.AlipayTradePay
- v2, err := PostAliPayAPISelfV2(client, bm, "alipay.trade.pay", &aliPsp)
- if err != nil {
- xlog.Error(err)
- return nil, err
- }
- res := v2.(*md.AlipayTradePay)
- return res, nil
- }
- func AlipayTradeQuery(args map[string]string) (*md.AlipayFundTransUniTransfer, error) {
- client := Comm(args)
- if client == nil {
- return nil, errors.New("获取失败")
- }
- //请求参数
- bm := make(gopay.BodyMap)
- bm.SetBodyMap("biz_content", func(bz gopay.BodyMap) {
- bz.Set("out_trade_no", args["out_trade_no"])
- })
-
- var aliPsp md.AlipayFundTransUniTransfer
- bs, err := PostAliPayAPISelfV2(client, bm, "alipay.trade.query", &aliPsp)
- if err != nil {
- xlog.Error(err)
- return nil, err
- }
- res := bs.(*md.AlipayFundTransUniTransfer)
- return res, nil
- }
-
- //结束信用服务订单
- func CreditagreementOrderFinish(args map[string]string) (*md.ZhimaCreditPayafteruseCreditbizorderFinish, error) {
- client := Comm(args)
- client.AppAuthToken = args["app_auth_token"]
- if client == nil {
- return nil, errors.New("获取失败")
- }
- //请求参数
- bm := make(gopay.BodyMap)
- // biz_content
- bm.SetBodyMap("biz_content", func(bz gopay.BodyMap) {
- bz.Set("out_request_no", args["out_request_no"])
- bz.Set("credit_biz_order_id", args["credit_biz_order_id"])
- bz.Set("is_fulfilled", args["is_fulfilled"])
- bz.Set("remark", args["remark"])
- })
-
- var aliPsp md.ZhimaCreditPayafteruseCreditbizorderFinish
- bs, err := PostAliPayAPISelfV2(client, bm, "zhima.credit.payafteruse.creditbizorder.finish", &aliPsp)
- if err != nil {
- xlog.Error(err)
- return nil, err
- }
- res := bs.(*md.ZhimaCreditPayafteruseCreditbizorderFinish)
- return res, nil
- }
-
- func PostAliPayAPISelfV2(a *alipay.Client, bm gopay.BodyMap, method string, aliRsp interface{}) (aliRsps interface{}, err error) {
- var (
- bs, bodyBs []byte
- )
- // check if there is biz_content
- bz := bm.GetInterface("biz_content")
- if bzBody, ok := bz.(gopay.BodyMap); ok {
- if bodyBs, err = json.Marshal(bzBody); err != nil {
- return aliRsp, fmt.Errorf("json.Marshal(%v):%w", bzBody, err)
- }
- bm.Set("biz_content", string(bodyBs))
- }
-
- if bs, err = doAliPaySelf(a, bm, method); err != nil {
- return aliRsp, err
- }
- switch method {
- case "alipay.trade.app.pay":
- return string(bs), nil
- case "alipay.trade.wap.pay", "alipay.trade.page.pay", "alipay.user.certify.open.certify", "zhima.credit.payafteruse.creditagreement.sign":
- return string(bs), nil
- default:
- if err = json.Unmarshal(bs, aliRsp); err != nil {
- return aliRsp, err
- }
- return aliRsp, nil
- }
- }
-
- // 向支付宝发送自定义请求
- func doAliPaySelf(a *alipay.Client, bm gopay.BodyMap, method string) (bs []byte, err error) {
- var (
- url, sign string
- )
- bm.Set("method", method)
-
- // check public parameter
- checkPublicParam(a, bm)
-
- // check sign
- if bm.GetString("sign") == "" {
- sign, err = alipay.GetRsaSign(bm, bm.GetString("sign_type"), a.PrivateKeyType, a.PrivateKey)
- if err != nil {
- return nil, fmt.Errorf("GetRsaSign Error: %v", err)
- }
- bm.Set("sign", sign)
- }
-
- if a.DebugSwitch == gopay.DebugOn {
- req, _ := json.Marshal(bm)
- xlog.Debugf("Alipay_Request: %s", req)
- }
- param := alipay.FormatURLParam(bm)
- switch method {
- case "alipay.trade.app.pay":
- return []byte(param), nil
- case "alipay.trade.wap.pay", "alipay.trade.page.pay", "alipay.user.certify.open.certify", "zhima.credit.payafteruse.creditagreement.sign":
- return []byte(baseUrl + "?" + param), nil
- default:
- httpClient := xhttp.NewClient()
- url = baseUrlUtf8
- res, bs, errs := httpClient.Type(xhttp.TypeForm).Post(url).SendString(param).EndBytes()
- if len(errs) > 0 {
- return nil, errs[0]
- }
- if a.DebugSwitch == gopay.DebugOn {
- xlog.Debugf("Alipay_Response: %s%d %s%s", xlog.Red, res.StatusCode, xlog.Reset, string(bs))
- }
- if res.StatusCode != 200 {
- return nil, fmt.Errorf("HTTP Request Error, StatusCode = %d", res.StatusCode)
- }
- return bs, nil
- }
- }
- func checkPublicParam(a *alipay.Client, bm gopay.BodyMap) {
- bm.Set("format", "JSON")
-
- if bm.GetString("app_id") == "" && a.AppId != util.NULL {
- bm.Set("app_id", a.AppId)
- }
- if bm.GetString("app_cert_sn") == "" && a.AppCertSN != util.NULL {
- bm.Set("app_cert_sn", a.AppCertSN)
- }
- if bm.GetString("alipay_root_cert_sn") == "" && a.AliPayRootCertSN != util.NULL {
- bm.Set("alipay_root_cert_sn", a.AliPayRootCertSN)
- }
- if bm.GetString("return_url") == "" && a.ReturnUrl != util.NULL {
- bm.Set("return_url", a.ReturnUrl)
- }
- bm.Set("charset", "utf-8")
- if bm.GetString("charset") == "" && a.Charset != util.NULL {
- bm.Set("charset", a.Charset)
- }
- bm.Set("sign_type", alipay.RSA2)
- if bm.GetString("sign_type") == "" && a.SignType != util.NULL {
- bm.Set("sign_type", a.SignType)
- }
- bm.Set("timestamp", time.Now().Format(util.TimeLayout))
-
- bm.Set("version", "1.0")
- if bm.GetString("notify_url") == "" && a.NotifyUrl != util.NULL {
- bm.Set("notify_url", a.NotifyUrl)
- }
- if bm.GetString("app_auth_token") == "" && a.AppAuthToken != util.NULL {
- bm.Set("app_auth_token", a.AppAuthToken)
- }
- if bm.GetString("auth_token") == "" && a.AuthToken != util.NULL {
- bm.Set("auth_token", a.AuthToken)
- }
- }
-
- //原路退回
- func AlipayTradeRefund(args map[string]string) (*md.AlipayTradeRefund, error) {
- client := Comm(args)
- if client == nil {
- return nil, errors.New("获取失败")
- }
- //请求参数
- bm := make(gopay.BodyMap)
- bm.SetBodyMap("biz_content", func(bz gopay.BodyMap) {
- bz.Set("trade_no", args["trade_no"])
- bz.Set("refund_amount", args["refund_amount"])
- bz.Set("refund_reason", args["refund_reason"])
- bz.Set("out_request_no", args["out_request_no"])
- })
- var aliPsp md.AlipayTradeRefund
- v2, err := PostAliPayAPISelfV2(client, bm, "alipay.trade.refund", &aliPsp)
- if err != nil {
- xlog.Error(err)
- return nil, err
- }
- res := v2.(*md.AlipayTradeRefund)
- return res, nil
- }
|