Przeglądaj źródła

添加支付宝支付

huangrf 6 lat temu
rodzic
commit
f5d737d445

+ 2 - 5
controllers/partial/SysPublicController.go

@@ -6,6 +6,7 @@ import (
 	"fmt"
 	"git.qianqiusoft.com/qianqiusoft/light-apiengine/entitys"
 	"git.qianqiusoft.com/qianqiusoft/light-apiengine/models"
+	"git.qianqiusoft.com/qianqiusoft/light-apiengine/third/alipay"
 	"git.qianqiusoft.com/qianqiusoft/light-apiengine/third/wx"
 	"github.com/silenceper/wechat/pay"
 	"io/ioutil"
@@ -91,11 +92,7 @@ func SysPublic_WxjssdkParams(c *entitys.CtrlContext) {
 // @Success 200 {object} Account
 // @Failure 403 :id is empty
 func SysPublic_AlipayCallback(c *entitys.CtrlContext) {
-
-	ret := __none_func_sys_public__()
-	if ret{
-		c.Ctx.String(200,"")
-	}
+	alipay.CallWxPayCallbackHandler(c)
 }
 
 

+ 57 - 0
third/alipay/alipay.go

@@ -0,0 +1,57 @@
+package alipay
+
+import (
+	"fmt"
+	"git.qianqiusoft.com/qianqiusoft/light-apiengine/entitys"
+	"git.qianqiusoft.com/qianqiusoft/light-apiengine/models"
+	"github.com/smartwalle/alipay"
+)
+
+var aliPayCallbackHandler func(result *alipay.TradeNotification)models.SysReturn = nil
+
+// 注册微信支付回调处理函数
+func RegisterAliPayCallbackHandler(handler func(result *alipay.TradeNotification)models.SysReturn){
+	aliPayCallbackHandler = handler
+}
+
+func CallWxPayCallbackHandler(c *entitys.CtrlContext)models.SysReturn{
+	if aliPayCallbackHandler == nil{
+		return models.SysReturn{500, "微信支付回调处理函数为空", nil}
+	}
+
+	noti, err := alipayClient.GetTradeNotification(c.Ctx.Request)
+	if err != nil{
+		return models.SysReturn{500, err.Error(), nil}
+	}
+
+	ret := aliPayCallbackHandler(noti)
+	if ret.Code != 200{
+		fmt.Println("支付宝支付失败", ret.Msg)
+	}else{
+		fmt.Println("支付宝支付成功")
+	}
+
+	alipay.AckNotification(c.Ctx.Writer)
+	return ret
+}
+
+// 扫码支付
+func PayNavite(param *PayParams)(*alipay.TradePreCreateRsp, error){
+	p := alipay.TradePreCreate{}
+	p.NotifyURL=alipayConfig.AliPayCallback
+	p.Subject=param.Subject
+	p.OutTradeNo = param.OutTradeNo
+	p.TotalAmount = param.TotalAmount
+	if param.ProductCode == ""{
+		p.ProductCode = p.ProductCode
+	}else{
+		p.ProductCode = "FAST_INSTANT_TRADE_PAY"
+	}
+	resp, err := alipayClient.TradePreCreate(p)
+	if err != nil{
+		fmt.Println(err.Error())
+		return nil, err
+	}
+
+	return resp, nil
+}

+ 51 - 0
third/alipay/global.go

@@ -0,0 +1,51 @@
+package alipay
+
+import (
+	"fmt"
+	"github.com/smartwalle/alipay"
+	"git.qianqiusoft.com/qianqiusoft/light-apiengine/config"
+	"git.qianqiusoft.com/qianqiusoft/light-apiengine/entitys"
+	"io/ioutil"
+)
+
+var alipayClient *alipay.Client = nil
+
+var alipayConfig struct {
+	AppId                string // app id
+	AppPrivateKeyFile    string // 保存支付宝开发平台助手生成应用密钥(第一个页面)内容的文件
+	AppPublicCertFile    string // 应用公钥证书,获取csr并上传csr后获得的
+	AliPayRootCertFile   string // 支付宝根证书,获取csr并上传csr后获得的
+	AliPayPublicCertFile string // 支付宝公钥证书,获取csr并上传csr后获得的
+	AliPayCallback       string // 支付宝完整回调信息接口url,既notifyurl
+}
+
+func init(){
+	alipayConfig.AppId = config.AppConfig.GetKey("appid")
+	alipayConfig.AppPrivateKeyFile = config.AppConfig.GetKey("app_private_key_file") 		// 保存支付宝开发平台助手生成应用密钥(第一个页面)内容的文件
+	alipayConfig.AppPublicCertFile = config.AppConfig.GetKey("app_public_cert_file") 		// 应用公钥证书,获取csr并上传csr后获得的
+	alipayConfig.AliPayRootCertFile = config.AppConfig.GetKey("alipay_root_cert_file")		// 支付宝根证书,获取csr并上传csr后获得的
+	alipayConfig.AliPayPublicCertFile = config.AppConfig.GetKey("alipay_public_cert_file")// 支付宝公钥证书,获取csr并上传csr后获得的
+	alipayConfig.AliPayCallback = config.AppConfig.GetKey("alipay_callback")				// 支付宝完整回调信息接口url,既notifyurl
+
+	bytess , err := ioutil.ReadFile(alipayConfig.AppPrivateKeyFile)
+	if err != nil{
+		fmt.Println("init alipay error, app private key file", alipayConfig.AppPrivateKeyFile, "does not exist")
+		return
+	}
+	alipayClient, err = alipay.New(alipayConfig.AppId, string(bytess), true)
+}
+
+/***********************************************************/
+// 支付参数
+type PayParams struct{
+	// 请求上下文
+	Ctx *entitys.CtrlContext
+	// 订单标题
+	Subject string
+	// 交易单号(最长64位)
+	OutTradeNo string
+	// 订单总金额,单位为元,精确到小数点后两位,取值范围[0.01,100000000]
+	TotalAmount string
+	// 销售产品码,与支付宝签约的产品码名称。 注:目前仅支持FAST_INSTANT_TRADE_PAY
+	ProductCode string
+}

+ 6 - 0
third/wx/global.go

@@ -67,6 +67,11 @@ func (lc *LocalCache)Get(key string) interface{}{
 	if o, e := lc.m[key]; !e{
 		return nil
 	}else{
+		timing := lc.m[key + "timing"].(time.Time)
+		if time.Now().Sub(timing) > 90 * time.Minute{
+			// 过期返回nil
+			return nil
+		}
 		return o
 	}
 }
@@ -75,6 +80,7 @@ func (lc *LocalCache)Set(key string, val interface{}, timeout time.Duration) err
 	defer lc.mutex.Unlock()
 
 	lc.m[key] = val
+	lc.m[key + "timing"] = time.Now()
 	return nil
 }
 func (lc *LocalCache)IsExist(key string) bool{