package index import ( "crypto" "crypto/rand" "crypto/rsa" "crypto/sha256" "crypto/x509" "encoding/base64" "encoding/json" "encoding/pem" "errors" "fmt" "github.com/astaxie/beego" "github.com/astaxie/beego/httplib" "strings" "system_pay/controllers/index/model" "system_pay/utils" //"math/rand" ) //拉卡拉统一支付 type PayController struct { beego.Controller } // @Title // @Description 拉卡拉统一支付 // @Param data body model.PlaceAnOrderParamInput true "输入项" // @Success 200 // @router /unified_order [post] func (this *PayController)UnifiedOrder() { //Params var input model.PlaceAnOrderParamInput if err := json.Unmarshal(this.Ctx.Input.RequestBody, &input); err != nil { this.Data["json"] = utils.CheckError(err, "") this.ServeJSON() return //this.Data["json"] = utils.CheckError(errors.New(languages.ParamsError), languages.SystemError) //this.ServeJSON() //return } //validate if err := input.ValidPlaceAnOrderParamInput(); err != nil { this.Data["json"] = utils.CheckError(err,"") this.ServeJSON() return } data := make(map[string]interface{}) data["req_time"] = "20220714160009" data["version"] = "3.0" data["out_org_code"] = "OP00000003" //"out_order_no": "KFPT20220714160009228907288", // "merchant_no": "8222900701106PZ", // "vpos_id": "587305941625155584", // "channel_id": "2021052614391", // "total_amount": "1", // "busi_mode": "PAY", // "order_efficient_time": "20220714170009", // "notify_url": "http://run.mocky.io/v3/b02c9448-20a2-4ff6-a678-38ecab30161d", // "support_cancel": "0", // "support_refund": "1", // "support_repeat_pay": "1", // "busi_type_param": "[{\"busi_type\":\"UPCARD\",\"params\":{\"crd_flg\":\"CRDFLG_D|CRDFLG_C|CRDFLG_OTH\"}},{\"busi_type\":\"SCPAY\",\"params\":{\"pay_mode\":\"WECHAT\",\"crd_flg\":\"CRDFLG_D\"}}]", // "counter_param": "{\"pay_mode\":\"ALIPAY\"}", // "out_user_id": "", // "order_info": "自动化测试", // "extend_info": "自动化测试", // "callback_url": "" data2 := make(map[string]interface{}) data2["out_trade_no"] = "FD660E1FAA3A4470933CDEDAE1EC1DEE" data2["merchant_no"] = "822290070111135" data2["term_no"] = "29034705" data2["auth_code"] = "135178236713755038" data2["total_amount"] = "0.01" data2["out_order_no"] = "08F4542EEC6A4497BC419161747A92EE" data2["order_efficient_time"] = "20230620130000" //订单有效期 格式yyyyMMddHHmmss,最大支持下单时间+2天 data2["notify_url"] = input.NoticeURL //订单支付成功后商户接收订单通知的地址 http://xxx.xxx.com data2["callback_url"] = input.ReturnURL //客户端下单完成支付后返回的商户网页跳转地址 data2["order_info"] = "必康测试订单标题" //订单标题,在使用收银台扫码支付时必输入,交易时送往账户端 //data2["goods_mark"] = input.AttachInfo //商品信息标识 (1:含商品信息,不填默认不含商品信息) data["req_data"] = make(map[string]interface{}) data["req_data"] = data2 //data3 := make(map[string]interface{}) //data3["request_ip"] = "10.176.1.192" //data3["location"] = "+37.123456789,-121.123456789" //data2["location_info"] = make(map[string]inteace{}) //data2["location_info"] = data3 //data2["out_order_no"] = input.AttachInfo //商户订单号 //data2["total_amount"] = input.AttachInfo //订单金额,单位:分 //data2["order_efficient_time"] = input.AttachInfo //订单有效期 格式yyyyMMddHHmmss,最大支持下单时间+2天 // //data2["notify_url"] = input.AttachInfo //订单支付成功后商户接收订单通知的地址 http://xxx.xxx.com //data2["callback_url"] = input.AttachInfo //商户订单号 //data2["order_info"] = input.AttachInfo //订单标题,在使用收银台扫码支付时必输入,交易时送往账户端 //data2["goods_mark"] = input.AttachInfo //商品信息标识 (1:含商品信息,不填默认不含商品信息) //var data model.LakalaParamInput //data.Version = "3.0" //data.ReqTime = "20220714160009" // //data.ReqData.OutOrderNo = input.AttachInfo //商户订单号 ////data.ReqData.MerchantNo = //银联商户号 //data.ReqData.TotalAmount = input.GoodsPrice //订单金额,单位:分 ////data.ReqData.OrderEfficientTime = //订单有效期 格式yyyyMMddHHmmss,最大支持下单时间+2天 // //data.ReqData.NotifyUrl = input.NoticeURL //订单支付成功后商户接收订单通知的地址 http://xxx.xxx.com //data.ReqData.CallbackUrl = input.ReturnURL //客户端下单完成支付后返回的商户网页跳转地址 ////data.ReqData.OrderInfo = input.OrderId //订单标题,在使用收银台扫码支付时必输入,交易时送往账户端 //data.ReqData.GoodsMark = input.GoodsDes //商品信息标识 (1:含商品信息,不填默认不含商品信息) //数据重组 - end ////var data = input.ReqData //fmt.Println(111) fmt.Println("拉卡拉输入参数") fmt.Println(data) data_json, err := json.Marshal(data) if err != nil { this.Data["json"] = utils.CheckError(errors.New("Map转化为byte数组失败"),"异常") this.ServeJSON() return } //url := "https://test.wsmsd.cn/sit/api/v3/labs/trans/preorder" //聚合主扫url //url := "https://test.wsmsd.cn/sit/api/v3/labs/trans/micropay" //聚合被扫url url := "https://test.wsmsd.cn/sit/api/v3/ccss/counter/order/create" //拉卡拉收银台订单创建url //调拉卡拉接口 err, m_web_url := lakala_post(url, data_json) if err != nil { this.Data["json"] = utils.CheckError(err,"拉卡拉错误") this.ServeJSON() return } response := make(map[string]string) response["m_web_url"] = m_web_url this.Data["json"] = utils.SuccessLakala(response) this.ServeJSON() } // @Title // @Description 拉卡拉统一支付 // @Param data body model.PlaceAnOrderParamInput true "输入项" // @Success 200 // @router /unified_order [post] //func (this *PayController)UnifiedOrder() { // // //Params // var input model.PlaceAnOrderParamInput // if err := json.Unmarshal(this.Ctx.Input.RequestBody, &input); err != nil { // this.Data["json"] = utils.CheckError(err, "") // this.ServeJSON() // return // //this.Data["json"] = utils.CheckError(errors.New(languages.ParamsError), languages.SystemError) // //this.ServeJSON() // //return // } // // //validate // if err := input.ValidPlaceAnOrderParamInput(); err != nil { // this.Data["json"] = utils.CheckError(err,"") // this.ServeJSON() // return // } // // if input.PayType==1 { // // } // // data := make(map[string]interface{}) // data["req_time"] = "20220714160009" // data["version"] = "3.0" // data["out_org_code"] = "OP00000003" // // data2 := make(map[string]interface{}) // data2["merchant_no"] = "822290070111135" // data2["term_no"] = "29034705" // //data2["out_trade_no"] = "FD660E1FAA3A4470933CDEDAE1EC1D8E" // data2["out_trade_no"] = "FD660E1FAA3A4470933CDEDAE1EC1D8E" // data2["auth_code"] = "135178236713755038" // data2["total_amount"] = "123" // //data2["out_order_no"] = "08F4542EEC6A4497BC419161747A92FA" // data2["out_order_no"] = "08F4542EEC6A4497BC419161747A92FA" // data["req_data"] = make(map[string]interface{}) // data["req_data"] = data2 // // data3 := make(map[string]interface{}) // data3["request_ip"] = "10.176.1.192" // data3["location"] = "+37.123456789,-121.123456789" // data2["location_info"] = make(map[string]interface{}) // data2["location_info"] = data3 // // //data2["out_order_no"] = input.AttachInfo //商户订单号 // //data2["total_amount"] = input.AttachInfo //订单金额,单位:分 // //data2["order_efficient_time"] = input.AttachInfo //订单有效期 格式yyyyMMddHHmmss,最大支持下单时间+2天 // // //data2["notify_url"] = input.AttachInfo //订单支付成功后商户接收订单通知的地址 http://xxx.xxx.com // //data2["callback_url"] = input.AttachInfo //商户订单号 // //data2["order_info"] = input.AttachInfo //订单标题,在使用收银台扫码支付时必输入,交易时送往账户端 // //data2["goods_mark"] = input.AttachInfo //商品信息标识 (1:含商品信息,不填默认不含商品信息) // // //var data model.LakalaParamInput // //data.Version = "3.0" // //data.ReqTime = "20220714160009" // // //data.ReqData.OutOrderNo = input.AttachInfo //商户订单号 // ////data.ReqData.MerchantNo = //银联商户号 // //data.ReqData.TotalAmount = input.GoodsPrice //订单金额,单位:分 // ////data.ReqData.OrderEfficientTime = //订单有效期 格式yyyyMMddHHmmss,最大支持下单时间+2天 // // //data.ReqData.NotifyUrl = input.NoticeURL //订单支付成功后商户接收订单通知的地址 http://xxx.xxx.com // //data.ReqData.CallbackUrl = input.ReturnURL //客户端下单完成支付后返回的商户网页跳转地址 // ////data.ReqData.OrderInfo = input.OrderId //订单标题,在使用收银台扫码支付时必输入,交易时送往账户端 // //data.ReqData.GoodsMark = input.GoodsDes //商品信息标识 (1:含商品信息,不填默认不含商品信息) // //数据重组 - end // // ////var data = input.ReqData // //fmt.Println(111) // //fmt.Println(data) // // data_json, err := json.Marshal(data) // if err != nil { // this.Data["json"] = utils.CheckError(errors.New("Map转化为byte数组失败"),"异常") // this.ServeJSON() // return // } // // //url := "https://test.wsmsd.cn/sit/api/v3/labs/trans/preorder" //聚合主扫url // //url := "https://test.wsmsd.cn/sit/api/v3/labs/trans/micropay" //聚合被扫url // url := "https://test.wsmsd.cn/sit/api/v3/ccss/counter/order/create" //拉卡拉收银台订单创建url // // //调拉卡拉接口 // err = lakala_post(url, data_json) // if err != nil { // this.Data["json"] = utils.CheckError(err,"拉卡拉错误") // this.ServeJSON() // return // } // // this.Data["json"] = utils.Success(nil) // this.ServeJSON() //} func lakala_post(url string, data_json []byte) (error, string) { authorization, err := getAuthorization(string(data_json)) if err != nil { return err, "" } fmt.Println(url) fmt.Println(authorization) req := httplib.Post(url) //req.Header("Authorization", "LKLAPI-SHA256withRSA appid=\"\", serial_no=\"\", timestamp=\"\", nonce_str=\"\", signature=\"2233\"") req.Header("Authorization", authorization) req.Header("Accept", "application/json") req.Header("Content-Type", "application/json") req.Body(data_json) body, err := req.Bytes() if err != nil { return err, "" } temp := make(map[string]interface{}, 0) if err = json.Unmarshal(body, &temp); err != nil { return err, "" } fmt.Println("拉卡拉返回值") fmt.Println(temp) //todo if temp["code"] != "000000" { //this.Data["json"] = utils.CheckError(errors.New("拉卡拉错误"), temp["msg"].(string)) //todo //this.ServeJSON() return errors.New(temp["msg"].(string)), "" } temp2, _ := temp["resp_data"].(map[string]string) if temp2["counter_url"]=="" { return errors.New("拉卡拉返回值「counter_url」为空错误"), "" } return nil, temp2["counter_url"] } func getAuthorization(body string) (string, error) { appid := "OP00000003" mchSerialNo := "00dfba8194c41b84cf" //nonceStr := strconv.Itoa(rand.Intn(32)) // 构造随机数 nonceStr := "12345678901234567890123456789012" // 构造随机数 //timestamp := strconv.FormatInt(time.Now().Unix(), 10) timestamp := "1686808027" //String nonceStr = generateNonceStr(); //long timestamp = generateTimestamp(); message := appid + "\n" + mchSerialNo + "\n" + timestamp + "\n" + nonceStr + "\n" + body + "\n"; //System.out.println("getToken message : " + message); //PrivateKey merchantPrivateKey = loadPrivateKey(new FileInputStream(new File(merchantPrivateKeyPath))); //String signature = this.sign(message.getBytes(ENCODING), merchantPrivateKey); //privateRaw := "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDokGGq7SlDoULN\nPULY8lcb2uXJcrFKkJI/lSfPppIkGH4xPfQytZXRlonpXqgOvovflJT5VhRvoLe2\ninJ/59kRF59KTerbCG5sG2IHhR/qCUGHervnZuPwgrjOOlnB19VCCUKY1tcplkZa\nKIksUU3TVh09GB3lUngkuOeO15ihcFHMIknOiSpL+Q04+qQf0g++9CxdQUtNY5za\nZ2Jdvch/4yFstR59qQu73ZCCYHFqXaVakyfOC3xOQkRB58jPOUvIab9zwo2hPukT\n+6qkqfokqMhX979HhNshPAJEEUXp4szk0QtP+2n8hq8t3Dws+GY8ElAFvmeGHx5j\nWzPYAcXvAgMBAAECggEBALIsu8caf/zCdc2MW8SelkJPCLG330DDVmjEO4YJlfl1\nkmjjkE2xdSDn9q0GyjbRoZQf36rPWkTTmyyNEYAQ/urrcCybWY2J/h9xMz+TrIm/\noabMT13QJF5FqJTHe7DZTReUxKMYJixEZ433dHCxsbByT2BZM75X2pg32aBEaTl0\nv9OfIMwfaJ5fSBmleJv4q/Lfd232/oOPzyr+EHfsMpTwOrgzQwPNoah1GvH+jBhz\ngoafi36vT8HVjJ+ZjOreH+Z2zVas683Le62rQaN/51jHS5vQGd2+z3qrI3kvu8KK\nWu0kIDQwCKtSFUT00MiKSaklE9JHf8rCNm3+en4kjfECgYEA/0Z2QaP4sOUt1+cZ\nIOprsMkJOl2sLTTDx3MseD2BxUukLDT8P3HTWLtBN9AkGlL6XD8WSs1k9YlGCqf2\ny9qC43Bgwsky8CH1ACk5K4PuWidGUQiqW4Oll/ris2vjagE+QfMHFFa7IalV5FvI\nv9L01jMqSL4duoM5w/WlLyLu8s0CgYEA6TlppWuxUMbxhEL5jmCZSSvsyhmIOdRk\nt4V9MuxwiRuItzywMo4+O7Hs6tjAxTnV/ROa33qyQtm4Olmd4Oa/TkmAJFX+mUrW\njUohDvm7Js2Y7/eeSRcRQLcgCjncpNe3AJoeVEvrGeaJMERYXnTwboUDKxsRyFFq\nAyuZHfuh86sCgYAm3pjFF+2XKd5YIKUv4OHy8jmIfJjp7T3eUcg0qtDmtMTTwmGi\nW3ed7C1bDUNiCr56a1S+oRW9WWCj4L1wft4tOYBSSIaMD++ZTa2Z1aXmblKDpjki\nZCJDyPzZ6xSeoH/VVOcADtDBqGIeumcP5lRHhVTr7J7kNnUGRJIZYk1WBQKBgQCl\nLAIEI4cKnDrD3uL60LL+vVsPrpFp02AZETMf84+nqpZin1pyE4dDo7kUgbnUdCd2\n+oF+sFi7O5Jb0MgdVY47FZbpJPYQ/o2AtvU+s+K1knozyPyS6wFPAeJxG5WGMTfr\n9zpvnOy+BSU3x8+F5e+5df5OcvdfFTmtUR05vNJvzQKBgHUtziAeWo7H6vxknFcc\nkVv7++a4IWF59eP+rpxlaHOtPTI43PLxJgSHEbw3epEzTUnCL9dpP8n48fuYuwM+\n+vpAujDcaGjGffmxW40E6wuGjOYBNg1zjSfEyjxF2fY+D9WoICSPHnrWB0/BEAZB\naL9Lho8+BUEFergUMjxUdvAS" //privateRaw := "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDvDBZyHUDndAGx\nrIcsCV2njhNO3vCEZotTaWYSYwtDvkcAb1EjsBFabXZaKigpqFXk5XXNI3NIHP9M\n8XKzIgGvc65NpLAfRjVql8JiTvLyYd1gIUcOXMInabu+oX7dQSI1mS8XzqaoVRhD\nZQWhXcJW9bxMulgnzvk0Ggw07AjGF7si+hP/Va8SJmN7EJwfQq6TpSxR+WdIHpbW\ndhZ+NHwitnQwAJTLBFvfk28INM39G7XOsXdVLfsooFdglVTOHpNuRiQAj9gShCCN\nrpGsNQxDiJIxE43qRsNsRwigyo6DPJk/klgDJa417E2wgP8VrwiXparO4FMzOGK1\n5quuoD7DAgMBAAECggEBANhmWOt1EAx3OBFf3f4/fEjylQgRSiqRqg8Ymw6KGuh4\nmE4Md6eW/B6geUOmZjVP7nIIR1wte28M0REWgn8nid8LGf+v1sB5DmIwgAf+8G/7\nqCwd8/VMg3aqgQtRp0ckb5OV2Mv0h2pbnltkWHR8LDIMwymyh5uCApbn/aTrCAZK\nNXcPOyAn9tM8Bu3FHk3Pf24Er3SN+bnGxgpzDrFjsDSHjDFT9UMIc2WdA3tuMv9X\n3DDn0bRCsHnsIw3WrwY6HQ8mumdbURk+2Ey3eRFfMYxyS96kOgBC2hqZOlDwVPAK\nTPtS4hoq+cQ0sRaJQ4T0UALJrBVHa+EESgRaTvrXqAECgYEA+WKmy9hcvp6IWZlk\n9Q1JZ+dgIVxrO65zylK2FnD1/vcTx2JMn73WKtQb6vdvTuk+Ruv9hY9PEsf7S8gH\nSTTmzHOUgo5x0F8yCxXFnfji2juoUnDdpkjtQK5KySDcpQb5kcCJWEVi9v+zObM0\nZr1Nu5/NreE8EqUl3+7MtHOu1TMCgYEA9WM9P6m4frHPW7h4gs/GISA9LuOdtjLv\nAtgCK4cW2mhtGNAMttD8zOBQrRuafcbFAyU9de6nhGwetOhkW9YSV+xRNa7HWTeI\nRgXJuJBrluq5e1QGTIwZU/GujpNaR4Qiu0B8TodM/FME7htsyxjmCwEfT6SDYlke\nMzTbMa9Q0DECgYBqsR/2+dvD2YMwAgZFKKgNAdoIq8dcwyfamUQ5mZ5EtGQL2yw4\n8zibHh/LiIxgUD1Kjk/qQgNsX45NP4iOc0mCkrgomtRqdy+rumbPTNmQ0BEVJCBP\nscd+8pIgNiTvnWpMRvj7gMP0NDTzLI3wnnCRIq8WAtR2jZ0Ejt+ZHBziLQKBgQDi\nbEe/zqNmhDuJrpXEXmO7fTv3YB/OVwEj5p1Z/LSho2nHU3Hn3r7lbLYEhUvwctCn\nLl2fzC7Wic1rsGOqOcWDS5NDrZpUQGGF+yE/JEOiZcPwgH+vcjaMtp0TAfRzuQEz\nNzV8YGwxB4mtC7E/ViIuVULHAk4ZGZI8PbFkDxjKgQKBgG8jEuLTI1tsP3kyaF3j\nAylnw7SkBc4gfe9knsYlw44YlrDSKr8AOp/zSgwvMYvqT+fygaJ3yf9uIBdrIilq\nCHKXccZ9uA/bT5JfIi6jbg3EoE9YhB0+1aGAS1O2dBvUiD8tJ+BjAT4OB0UDpmM6\nQsFLQgFyXgvDnzr/o+hQJelW" //privateRaw := "-----BEGIN PRIVATE KEY-----\nMIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDvDBZyHUDndAGx\nrIcsCV2njhNO3vCEZotTaWYSYwtDvkcAb1EjsBFabXZaKigpqFXk5XXNI3NIHP9M\n8XKzIgGvc65NpLAfRjVql8JiTvLyYd1gIUcOXMInabu+oX7dQSI1mS8XzqaoVRhD\nZQWhXcJW9bxMulgnzvk0Ggw07AjGF7si+hP/Va8SJmN7EJwfQq6TpSxR+WdIHpbW\ndhZ+NHwitnQwAJTLBFvfk28INM39G7XOsXdVLfsooFdglVTOHpNuRiQAj9gShCCN\nrpGsNQxDiJIxE43qRsNsRwigyo6DPJk/klgDJa417E2wgP8VrwiXparO4FMzOGK1\n5quuoD7DAgMBAAECggEBANhmWOt1EAx3OBFf3f4/fEjylQgRSiqRqg8Ymw6KGuh4\nmE4Md6eW/B6geUOmZjVP7nIIR1wte28M0REWgn8nid8LGf+v1sB5DmIwgAf+8G/7\nqCwd8/VMg3aqgQtRp0ckb5OV2Mv0h2pbnltkWHR8LDIMwymyh5uCApbn/aTrCAZK\nNXcPOyAn9tM8Bu3FHk3Pf24Er3SN+bnGxgpzDrFjsDSHjDFT9UMIc2WdA3tuMv9X\n3DDn0bRCsHnsIw3WrwY6HQ8mumdbURk+2Ey3eRFfMYxyS96kOgBC2hqZOlDwVPAK\nTPtS4hoq+cQ0sRaJQ4T0UALJrBVHa+EESgRaTvrXqAECgYEA+WKmy9hcvp6IWZlk\n9Q1JZ+dgIVxrO65zylK2FnD1/vcTx2JMn73WKtQb6vdvTuk+Ruv9hY9PEsf7S8gH\nSTTmzHOUgo5x0F8yCxXFnfji2juoUnDdpkjtQK5KySDcpQb5kcCJWEVi9v+zObM0\nZr1Nu5/NreE8EqUl3+7MtHOu1TMCgYEA9WM9P6m4frHPW7h4gs/GISA9LuOdtjLv\nAtgCK4cW2mhtGNAMttD8zOBQrRuafcbFAyU9de6nhGwetOhkW9YSV+xRNa7HWTeI\nRgXJuJBrluq5e1QGTIwZU/GujpNaR4Qiu0B8TodM/FME7htsyxjmCwEfT6SDYlke\nMzTbMa9Q0DECgYBqsR/2+dvD2YMwAgZFKKgNAdoIq8dcwyfamUQ5mZ5EtGQL2yw4\n8zibHh/LiIxgUD1Kjk/qQgNsX45NP4iOc0mCkrgomtRqdy+rumbPTNmQ0BEVJCBP\nscd+8pIgNiTvnWpMRvj7gMP0NDTzLI3wnnCRIq8WAtR2jZ0Ejt+ZHBziLQKBgQDi\nbEe/zqNmhDuJrpXEXmO7fTv3YB/OVwEj5p1Z/LSho2nHU3Hn3r7lbLYEhUvwctCn\nLl2fzC7Wic1rsGOqOcWDS5NDrZpUQGGF+yE/JEOiZcPwgH+vcjaMtp0TAfRzuQEz\nNzV8YGwxB4mtC7E/ViIuVULHAk4ZGZI8PbFkDxjKgQKBgG8jEuLTI1tsP3kyaF3j\nAylnw7SkBc4gfe9knsYlw44YlrDSKr8AOp/zSgwvMYvqT+fygaJ3yf9uIBdrIilq\nCHKXccZ9uA/bT5JfIi6jbg3EoE9YhB0+1aGAS1O2dBvUiD8tJ+BjAT4OB0UDpmM6\nQsFLQgFyXgvDnzr/o+hQJelW\n-----END PRIVATE KEY-----"; privateRaw := "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDvDBZyHUDndAGx\nrIcsCV2njhNO3vCEZotTaWYSYwtDvkcAb1EjsBFabXZaKigpqFXk5XXNI3NIHP9M\n8XKzIgGvc65NpLAfRjVql8JiTvLyYd1gIUcOXMInabu+oX7dQSI1mS8XzqaoVRhD\nZQWhXcJW9bxMulgnzvk0Ggw07AjGF7si+hP/Va8SJmN7EJwfQq6TpSxR+WdIHpbW\ndhZ+NHwitnQwAJTLBFvfk28INM39G7XOsXdVLfsooFdglVTOHpNuRiQAj9gShCCN\nrpGsNQxDiJIxE43qRsNsRwigyo6DPJk/klgDJa417E2wgP8VrwiXparO4FMzOGK1\n5quuoD7DAgMBAAECggEBANhmWOt1EAx3OBFf3f4/fEjylQgRSiqRqg8Ymw6KGuh4\nmE4Md6eW/B6geUOmZjVP7nIIR1wte28M0REWgn8nid8LGf+v1sB5DmIwgAf+8G/7\nqCwd8/VMg3aqgQtRp0ckb5OV2Mv0h2pbnltkWHR8LDIMwymyh5uCApbn/aTrCAZK\nNXcPOyAn9tM8Bu3FHk3Pf24Er3SN+bnGxgpzDrFjsDSHjDFT9UMIc2WdA3tuMv9X\n3DDn0bRCsHnsIw3WrwY6HQ8mumdbURk+2Ey3eRFfMYxyS96kOgBC2hqZOlDwVPAK\nTPtS4hoq+cQ0sRaJQ4T0UALJrBVHa+EESgRaTvrXqAECgYEA+WKmy9hcvp6IWZlk\n9Q1JZ+dgIVxrO65zylK2FnD1/vcTx2JMn73WKtQb6vdvTuk+Ruv9hY9PEsf7S8gH\nSTTmzHOUgo5x0F8yCxXFnfji2juoUnDdpkjtQK5KySDcpQb5kcCJWEVi9v+zObM0\nZr1Nu5/NreE8EqUl3+7MtHOu1TMCgYEA9WM9P6m4frHPW7h4gs/GISA9LuOdtjLv\nAtgCK4cW2mhtGNAMttD8zOBQrRuafcbFAyU9de6nhGwetOhkW9YSV+xRNa7HWTeI\nRgXJuJBrluq5e1QGTIwZU/GujpNaR4Qiu0B8TodM/FME7htsyxjmCwEfT6SDYlke\nMzTbMa9Q0DECgYBqsR/2+dvD2YMwAgZFKKgNAdoIq8dcwyfamUQ5mZ5EtGQL2yw4\n8zibHh/LiIxgUD1Kjk/qQgNsX45NP4iOc0mCkrgomtRqdy+rumbPTNmQ0BEVJCBP\nscd+8pIgNiTvnWpMRvj7gMP0NDTzLI3wnnCRIq8WAtR2jZ0Ejt+ZHBziLQKBgQDi\nbEe/zqNmhDuJrpXEXmO7fTv3YB/OVwEj5p1Z/LSho2nHU3Hn3r7lbLYEhUvwctCn\nLl2fzC7Wic1rsGOqOcWDS5NDrZpUQGGF+yE/JEOiZcPwgH+vcjaMtp0TAfRzuQEz\nNzV8YGwxB4mtC7E/ViIuVULHAk4ZGZI8PbFkDxjKgQKBgG8jEuLTI1tsP3kyaF3j\nAylnw7SkBc4gfe9knsYlw44YlrDSKr8AOp/zSgwvMYvqT+fygaJ3yf9uIBdrIilq\nCHKXccZ9uA/bT5JfIi6jbg3EoE9YhB0+1aGAS1O2dBvUiD8tJ+BjAT4OB0UDpmM6\nQsFLQgFyXgvDnzr/o+hQJelW" //privateRaw := "-----BEGIN PRIVATE KEY-----\nMIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDvDBZyHUDndAGx\nrIcsCV2njhNO3vCEZotTaWYSYwtDvkcAb1EjsBFabXZaKigpqFXk5XXNI3NIHP9M\n8XKzIgGvc65NpLAfRjVql8JiTvLyYd1gIUcOXMInabu+oX7dQSI1mS8XzqaoVRhD\nZQWhXcJW9bxMulgnzvk0Ggw07AjGF7si+hP/Va8SJmN7EJwfQq6TpSxR+WdIHpbW\ndhZ+NHwitnQwAJTLBFvfk28INM39G7XOsXdVLfsooFdglVTOHpNuRiQAj9gShCCN\nrpGsNQxDiJIxE43qRsNsRwigyo6DPJk/klgDJa417E2wgP8VrwiXparO4FMzOGK1\n5quuoD7DAgMBAAECggEBANhmWOt1EAx3OBFf3f4/fEjylQgRSiqRqg8Ymw6KGuh4\nmE4Md6eW/B6geUOmZjVP7nIIR1wte28M0REWgn8nid8LGf+v1sB5DmIwgAf+8G/7\nqCwd8/VMg3aqgQtRp0ckb5OV2Mv0h2pbnltkWHR8LDIMwymyh5uCApbn/aTrCAZK\nNXcPOyAn9tM8Bu3FHk3Pf24Er3SN+bnGxgpzDrFjsDSHjDFT9UMIc2WdA3tuMv9X\n3DDn0bRCsHnsIw3WrwY6HQ8mumdbURk+2Ey3eRFfMYxyS96kOgBC2hqZOlDwVPAK\nTPtS4hoq+cQ0sRaJQ4T0UALJrBVHa+EESgRaTvrXqAECgYEA+WKmy9hcvp6IWZlk\n9Q1JZ+dgIVxrO65zylK2FnD1/vcTx2JMn73WKtQb6vdvTuk+Ruv9hY9PEsf7S8gH\nSTTmzHOUgo5x0F8yCxXFnfji2juoUnDdpkjtQK5KySDcpQb5kcCJWEVi9v+zObM0\nZr1Nu5/NreE8EqUl3+7MtHOu1TMCgYEA9WM9P6m4frHPW7h4gs/GISA9LuOdtjLv\nAtgCK4cW2mhtGNAMttD8zOBQrRuafcbFAyU9de6nhGwetOhkW9YSV+xRNa7HWTeI\nRgXJuJBrluq5e1QGTIwZU/GujpNaR4Qiu0B8TodM/FME7htsyxjmCwEfT6SDYlke\nMzTbMa9Q0DECgYBqsR/2+dvD2YMwAgZFKKgNAdoIq8dcwyfamUQ5mZ5EtGQL2yw4\n8zibHh/LiIxgUD1Kjk/qQgNsX45NP4iOc0mCkrgomtRqdy+rumbPTNmQ0BEVJCBP\nscd+8pIgNiTvnWpMRvj7gMP0NDTzLI3wnnCRIq8WAtR2jZ0Ejt+ZHBziLQKBgQDi\nbEe/zqNmhDuJrpXEXmO7fTv3YB/OVwEj5p1Z/LSho2nHU3Hn3r7lbLYEhUvwctCn\nLl2fzC7Wic1rsGOqOcWDS5NDrZpUQGGF+yE/JEOiZcPwgH+vcjaMtp0TAfRzuQEz\nNzV8YGwxB4mtC7E/ViIuVULHAk4ZGZI8PbFkDxjKgQKBgG8jEuLTI1tsP3kyaF3j\nAylnw7SkBc4gfe9knsYlw44YlrDSKr8AOp/zSgwvMYvqT+fygaJ3yf9uIBdrIilq\nCHKXccZ9uA/bT5JfIi6jbg3EoE9YhB0+1aGAS1O2dBvUiD8tJ+BjAT4OB0UDpmM6\nQsFLQgFyXgvDnzr/o+hQJelW\n-----END PRIVATE KEY-----" signature, err := Sha256WithRsa(privateRaw, message) if err != nil { return signature, err } //fmt.Println(777) //fmt.Println(signature) authorization := "LKLAPI-SHA256withRSA " + "appid=\"" + appid + "\"," + "serial_no=\"" + mchSerialNo + "\"," + "timestamp=\"" + timestamp + "\"," + "nonce_str=\"" + nonceStr + "\"," + "signature=\"" + signature + "\""; //System.out.println("authorization message :" + authorization); return authorization, nil } func Sha256WithRsa(privateRaw string, msg string) (string, error) { privateRaw = strings.Trim(privateRaw, "\n") if !strings.HasPrefix(privateRaw, "-----BEGIN RSA PRIVATE KEY-----") { privateRaw = fmt.Sprintf("%s\n%s\n%s", "-----BEGIN RSA PRIVATE KEY-----", privateRaw, "-----END RSA PRIVATE KEY-----") } //fmt.Println(888) //fmt.Println(privateRaw) blockPri, _ := pem.Decode([]byte(privateRaw)) if blockPri == nil { return "", fmt.Errorf("blockPri is nil") } rsaPri, e := genPriKey(blockPri.Bytes, PKCS8) if e != nil { panic(e) } h := sha256.New() h.Write([]byte(msg)) d := h.Sum(nil) signature, err := rsa.SignPKCS1v15(rand.Reader, rsaPri, crypto.SHA256, d) if err != nil { //return "", errorx.Wrap(err) return "", err } encodedSig := base64.StdEncoding.EncodeToString(signature) return encodedSig, nil } const ( PKCS1 int64 = iota PKCS8 ) func genPriKey(privateKey []byte, privateKeyType int64) (*rsa.PrivateKey, error) { var priKey *rsa.PrivateKey var err error switch privateKeyType { case PKCS1: { priKey, err = x509.ParsePKCS1PrivateKey([]byte(privateKey)) if err != nil { return nil, err } } case PKCS8: { prkI, err := x509.ParsePKCS8PrivateKey([]byte(privateKey)) if err != nil { return nil, err } priKey = prkI.(*rsa.PrivateKey) } default: { return nil, fmt.Errorf("unsupport private key type") } } return priKey, nil } // ProcessingLogic is 处理逻辑 //func ProcessingLogic(p *models.PlaceAnOrderParam, ip string, payType uint) (interface{}, error) { // // fmt.Println("p: ", p) // fmt.Println("") // fmt.Println("") // fmt.Println("") // // // pay // if p.AppID == "" && p.IsServe == 0 { // p.AppID = WxAppID // } // // // 清空 return_url // AliClient.ReturnUrl = "" // // orderID := utils.GetUID() // // // 构造回调url // noticeURL := utils.GetNoticeURL(p.SourceCode, payType, p.IsServe) // // 传递给支付渠道的 // p.ServeNoticeUrl = noticeURL // // // 插入数据库 // db, err := common.NewPayConn() // if err != nil { // return nil, err // } // tx, err := db.Begin() // if err != nil { // return nil, err // } // // defer common.CloseTx(tx, err) // // beego.Info("AttachInfo: ", p.AttachInfo) // // attachMap := make(map[string]interface{}, 0) // attachMap["store_sn"] = p.StoreSn // attachMap["old_attach"] = p.AttachInfo // // attach, _ := json.Marshal(attachMap) // p.AttachInfo = string(attach) // // billID, err := repository.InsertPayBill(tx, p, orderID) // if err != nil { // return nil, err // } // // // 构造随机数 // nonceStr := gopay.GetRandomString(32) // // p.OrderId = orderID // p.Nonce = nonceStr // // // 服务商模式 // if p.IsServe == 1 { // // sm, err := serve.NewServiceMode(p) // if err != nil { // return nil, err // } // // res, err := sm.PlaceTheOrder() // if err != nil { // return nil, err // } // // err = repository.InsertPayBillDetailRequestBody(tx, billID, res.Request) // if err != nil { // return nil, err // } // // err = repository.InsertPayBillDetailResponseBody(tx, billID, res.Response) // if err != nil { // beego.Error("下单请求成功 --- 但插入成功后的参数失败") // return nil, err // } // // return res, nil // } // // // 以下是直连模式 wx / alipay / sqb // // // 判断是哪种 source_code // switch p.SourceCode { // case 1: // native // // bm := make(gopay.BodyMap) // bm.Set("nonce_str", nonceStr) // bm.Set("body", p.GoodsDes) // bm.Set("out_trade_no", orderID) // bm.Set("total_fee", p.GoodsPrice*100) // bm.Set("spbill_create_ip", ip) // bm.Set("trade_type", wechat.TradeType_Native) // bm.Set("sign_type", wechat.SignType_MD5) // bm.Set("notify_url", noticeURL) // // // 插入下单请求参数 // err = repository.InsertPayBillDetailRequestBody(tx, billID, bm) // if err != nil { // return nil, err // } // wxClient := GetWxClient(p.PlatformType, p.AppID) // wxResponse, err := wxClient.UnifiedOrder(bm) // if err != nil { // return nil, err // } // // ok, err := wechat.VerifySign(WxKey, wechat.SignType_MD5, wxResponse) // if err != nil || !ok { // beego.Error("验签失败, 订单号是: ", orderID) // beego.Error("wx response: ", wxResponse) // return nil, err // } // // // 插入下单成功后返回的参数 // err = repository.InsertPayBillDetailResponseBody(tx, billID, *wxResponse) // if err != nil { // beego.Error("下单请求成功 --- 但插入成功后的参数失败") // return nil, err // } // // response := new(models.UnifiedOrderResponse) // response.TradeType = p.SourceCode // response.OutTradeNo = orderID // response.QrCodeURL = wxResponse.CodeUrl // // return response, nil // // case 2: // // bm := make(gopay.BodyMap) // bm.Set("out_trade_no", orderID) // bm.Set("nonce_str", nonceStr) // bm.Set("body", p.GoodsDes) // bm.Set("total_fee", p.GoodsPrice*100) // bm.Set("spbill_create_ip", ip) // bm.Set("trade_type", wechat.TradeType_Mini) // bm.Set("openid", p.OpenID) // bm.Set("notify_url", noticeURL) // // // 插入下单请求参数 // err = repository.InsertPayBillDetailRequestBody(tx, billID, bm) // if err != nil { // return nil, err // } // // miniClient := GetWxClient(p.PlatformType, p.AppID) // // wxResponse, err := miniClient.UnifiedOrder(bm) // if err != nil { // return nil, err // } // // // 插入下单成功后返回的参数 // err = repository.InsertPayBillDetailResponseBody(tx, billID, *wxResponse) // if err != nil { // beego.Error("下单请求成功 --- 但插入成功后的参数失败") // return nil, err // } // // beego.Error("wxResponse.ErrCode: ", wxResponse.ErrCode) // beego.Error("wxResponse.ErrCodeDes: ", wxResponse.ErrCodeDes) // beego.Error("wxResponse.ReturnMsg: ", wxResponse.ReturnMsg) // beego.Error("wxResponse.ReturnCode: ", wxResponse.ReturnCode) // beego.Error("wxResponse.ResultCode: ", wxResponse.ResultCode) // // if wxResponse.ResultCode == "FAIL" { // beego.Error("wxResponse.ReturnMsg: ", wxResponse.ReturnMsg) // return nil, errors.New(wxResponse.ReturnMsg) // } // // ok, err := wechat.VerifySign("dibaocheng20190410dibaocheng2019", wechat.SignType_MD5, wxResponse) // if err != nil || !ok { // beego.Error("验签失败, 订单号是: ", orderID) // beego.Error("err: ", err) // return nil, errors.New("验签失败") // } // // pac := "prepay_id=" + wxResponse.PrepayId // timeStamp := strconv.FormatInt(time.Now().Unix(), 10) // paySign := wechat.GetH5PaySign(p.AppID, wxResponse.NonceStr, pac, wechat.SignType_MD5, timeStamp, "dibaocheng20190410dibaocheng2019") // // response := new(models.UnifiedOrderResponse) // response.TradeType = p.SourceCode // response.OutTradeNo = orderID // response.PrePayID = wxResponse.PrepayId // response.AppID = WxAppID // response.TimeStamp = timeStamp // response.NonceStr = wxResponse.NonceStr // response.Package = pac // response.SignType = wechat.SignType_MD5 // response.PaySign = paySign // // return response, nil // case 3: // js api // // tempMoney, _ := strconv.ParseFloat(fmt.Sprintf("%.2f", p.GoodsPrice*100), 64) // bm := make(gopay.BodyMap) // bm.Set("out_trade_no", orderID) // bm.Set("nonce_str", nonceStr) // bm.Set("body", p.GoodsDes) // bm.Set("total_fee", tempMoney) // bm.Set("spbill_create_ip", ip) // bm.Set("trade_type", wechat.TradeType_JsApi) // // bm.Set("openid", "omtH51brKlB5KrIeL0f3px7bmboo") // bm.Set("openid", p.OpenID) // bm.Set("notify_url", noticeURL) // // // 插入下单请求参数 // err = repository.InsertPayBillDetailRequestBody(tx, billID, bm) // if err != nil { // return nil, err // } // // fmt.Printf("bm: ", bm) // // wxClient := GetWxClient(p.PlatformType, p.AppID) // // wxResponse, err := wxClient.UnifiedOrder(bm) // if err != nil { // return nil, err // } // // // 插入下单成功后返回的参数 // err = repository.InsertPayBillDetailResponseBody(tx, billID, *wxResponse) // if err != nil { // beego.Error("下单请求成功 --- 但插入成功后的参数失败") // return nil, err // } // // ok, err := wechat.VerifySign(WxKey, wechat.SignType_MD5, wxResponse) // if err != nil || !ok { // beego.Error("验签失败, 订单号是: ", orderID) // return nil, err // } // // pac := "prepay_id=" + wxResponse.PrepayId // timeStamp := strconv.FormatInt(time.Now().Unix(), 10) // paySign := wechat.GetH5PaySign(WxAppID, wxResponse.NonceStr, pac, wechat.SignType_MD5, timeStamp, WxKey) // // response := new(models.UnifiedOrderResponse) // response.TradeType = p.SourceCode // response.OutTradeNo = orderID // // response.PrePayID = wxResponse.PrepayId // response.AppID = WxAppID // response.TimeStamp = timeStamp // response.NonceStr = wxResponse.NonceStr // response.Package = pac // response.SignType = wechat.SignType_MD5 // response.PaySign = paySign // // return response, nil // // case 4: // h5 // // tempMoney, _ := strconv.ParseFloat(fmt.Sprintf("%.2f", p.GoodsPrice*100), 64) // bm := make(gopay.BodyMap) // bm.Set("out_trade_no", orderID) // bm.Set("nonce_str", nonceStr) // bm.Set("body", p.GoodsDes) // bm.Set("device_info", "WEB") // bm.Set("total_fee", tempMoney) // bm.Set("spbill_create_ip", ip) // bm.Set("trade_type", wechat.TradeType_H5) // bm.Set("sign_type", wechat.SignType_MD5) // // 如果加入openid、只能是这个openid的所属者才能够支付 // // bm.Set("openid", "omtH51brKlB5KrIeL0f3px7bmboo") // bm.Set("notify_url", noticeURL) // // sceneInfo := make(map[string]map[string]string) // h5Info := make(map[string]string) // h5Info["type"] = "Wap" // h5Info["wap_url"] = p.WapURL // h5Info["wap_name"] = p.WapName // sceneInfo["h5_info"] = h5Info // bm.Set("scene_info", sceneInfo) // // // 插入下单请求参数 // err = repository.InsertPayBillDetailRequestBody(tx, billID, bm) // if err != nil { // return nil, err // } // // wxClient := GetWxClient(p.PlatformType, p.AppID) // wxResponse, err := wxClient.UnifiedOrder(bm) // if err != nil { // return nil, err // } // // // 插入下单成功后返回的参数 // err = repository.InsertPayBillDetailResponseBody(tx, billID, *wxResponse) // if err != nil { // beego.Error("下单请求成功 --- 但插入成功后的参数失败") // return nil, err // } // // ok, err := wechat.VerifySign(WxKey, wechat.SignType_MD5, wxResponse) // if err != nil || !ok { // beego.Error("验签失败, 订单号是: ", orderID) // return nil, err // } // // response := new(models.UnifiedOrderResponse) // response.TradeType = p.SourceCode // response.OutTradeNo = orderID // response.MWebURL = wxResponse.MwebUrl // // return response, nil // case 5: // 支付宝扫码 // //请求参数 // body := make(gopay.BodyMap) // body.Set("subject", p.GoodsDes) // body.Set("out_trade_no", orderID) // body.Set("total_amount", p.GoodsPrice) // // // 插入下单请求参数 // err = repository.InsertPayBillDetailRequestBody(tx, billID, body) // if err != nil { // return nil, err // } // // if AliClient.NotifyUrl == "" { // AliClient.SetNotifyUrl(AliPayNoticeURL) // } // //创建订单 // aliRsp, err := AliClient.TradePrecreate(body) // if err != nil { // beego.Error("支付宝 生成用户扫商品码下单失败: ", err) // return nil, err // } // // // 插入下单成功后返回的参数 // err = repository.InsertPayBillDetailResponseBody(tx, billID, *aliRsp) // if err != nil { // beego.Error("下单请求成功 --- 但插入成功后的参数失败") // return nil, err // } // // response := new(models.UnifiedOrderResponse) // response.TradeType = p.SourceCode // response.OutTradeNo = orderID // response.QrCodeURL = aliRsp.Response.QrCode // // return response, nil // case 6: // 支付宝手机网站 // // //构造参数 // body := make(gopay.BodyMap) // body.Set("subject", p.GoodsDes) // body.Set("out_trade_no", orderID) // body.Set("quit_url", p.QuitURL) // body.Set("total_amount", p.GoodsPrice) // body.Set("product_code", "QUICK_WAP_WAY") // // if AliClient.NotifyUrl == "" { // AliClient.SetNotifyUrl(AliPayNoticeURL) // } // // // 插入下单请求参数 // err = repository.InsertPayBillDetailRequestBody(tx, billID, body) // if err != nil { // return nil, err // } // // if p.ReturnURL != "" { // AliClient.ReturnUrl = p.ReturnURL // } // // //手机网站支付请求 // payURL, err := AliClient.TradeWapPay(body) // if err != nil { // beego.Error("支付宝手机网站下单失败: ", err) // return nil, err // } // // response := new(models.UnifiedOrderResponse) // response.TradeType = p.SourceCode // response.OutTradeNo = orderID // response.AliPayURL = payURL // // // 插入下单成功后返回的参数 // err = repository.InsertPayBillDetailResponseBody(tx, billID, response) // if err != nil { // beego.Error("下单请求成功 --- 但插入成功后的参数失败") // return nil, err // } // // return payURL, nil // case 9: // B2C // fmt.Println("") // // if p.PayType != 4 { // return nil, errors.New("参数错误") // } // // r := make(map[string]interface{}, 0) // var request models.SqbRequest // var requestBody models.AtOncePayRequestBody // var requestHead models.SqbHead // requestHead.Appid = beego.AppConfig.String("appid") // requestHead.SignType = "SHA256" // requestHead.Version = "1.0.0" // requestHead.RequestTime = time.Now().Format(time.RFC3339) // requestHead.Reserve = "{}" // // requestBody.RequestID = "R" + fmt.Sprint(time.Now().UnixNano()) // requestBody.BrandCode, _ = strconv.ParseInt(beego.AppConfig.String("brand_code"), 10, 64) // requestBody.StoreSn = p.StoreSn // requestBody.WorkstationSn = "0" // requestBody.CheckSn = orderID // requestBody.SalesTime = time.Now().Format(time.RFC3339) // requestBody.ExpireTime = 3 // requestBody.Amount = int64(p.GoodsPrice * 100) // requestBody.Currency = "CNY" // requestBody.Subject = p.GoodsDes // requestBody.Operator = p.Operator // requestBody.Customer = p.Customer // requestBody.SceneType = 1 // requestBody.DynamicID = p.DynamicID // requestBody.TenderType = 3 // // request.Body = requestBody // request.Head = requestHead // // r["request"] = &request // jRequest, err := json.Marshal(request) // if err != nil { // return nil, err // } // // sign := utils.RsaEncryption(string(jRequest), beego.AppConfig.String("encryption_sqb_pri")) // r["signature"] = sign // // finalParam, err := json.Marshal(r) // if err != nil { // return nil, err // } // // // 插入下单请求参数 // err = repository.InsertPayBillDetailRequestBody(tx, billID, r) // if err != nil { // return nil, err // } // // go SqbUnifiedOrder(finalParam, billID) // // // fmt.Println("result: ", result) // // // // 插入下单成功后返回的参数 // // err = repository.InsertPayBillDetailResponseBody(tx, billID, result) // // if err != nil { // // beego.Error("下单请求成功 --- 但插入成功后的参数失败: ", billID, " err: ", err) // // } // // // if result.Reponse.Body.ResultCode != "200" { // // beego.Info("支付失败, 订单id: ", billID) // // } // // // if result.Reponse.Body.BizResponse.ResultCode != "200" { // // beego.Info("支付失败, 订单id: ", billID) // // } // // mBody := map[string]string{ // "payment_order_code": orderID, // } // // return mBody, nil // case 10: // bk 支付宝扫码 // //请求参数 // body := make(gopay.BodyMap) // body.Set("subject", p.GoodsDes) // body.Set("out_trade_no", orderID) // body.Set("total_amount", p.GoodsPrice) // // // 插入下单请求参数 // err = repository.InsertPayBillDetailRequestBody(tx, billID, body) // if err != nil { // return nil, err // } // // if BkAliClient.NotifyUrl == "" { // BkAliClient.SetNotifyUrl(BkAliPayNoticeURL) // } // //创建订单 // aliRsp, err := BkAliClient.TradePrecreate(body) // if err != nil { // beego.Error("支付宝 生成用户扫商品码下单失败: ", err) // return nil, err // } // // // 插入下单成功后返回的参数 // err = repository.InsertPayBillDetailResponseBody(tx, billID, *aliRsp) // if err != nil { // beego.Error("下单请求成功 --- 但插入成功后的参数失败") // return nil, err // } // // response := new(models.UnifiedOrderResponse) // response.TradeType = p.SourceCode // response.OutTradeNo = orderID // response.QrCodeURL = aliRsp.Response.QrCode // // return response, nil // case 11: // bk 支付宝手机网站 // // //构造参数 // body := make(gopay.BodyMap) // body.Set("subject", p.GoodsDes) // body.Set("out_trade_no", orderID) // body.Set("quit_url", p.QuitURL) // body.Set("total_amount", p.GoodsPrice) // body.Set("product_code", "QUICK_WAP_WAY") // // if BkAliClient.NotifyUrl == "" { // BkAliClient.SetNotifyUrl(BkAliPayNoticeURL) // } // // // 插入下单请求参数 // err = repository.InsertPayBillDetailRequestBody(tx, billID, body) // if err != nil { // return nil, err // } // // if p.ReturnURL != "" { // BkAliClient.ReturnUrl = p.ReturnURL // } // // //手机网站支付请求 // payURL, err := BkAliClient.TradeWapPay(body) // if err != nil { // beego.Error("支付宝手机网站下单失败: ", err) // return nil, err // } // // response := new(models.UnifiedOrderResponse) // response.TradeType = p.SourceCode // response.OutTradeNo = orderID // response.AliPayURL = payURL // // // 插入下单成功后返回的参数 // err = repository.InsertPayBillDetailResponseBody(tx, billID, response) // if err != nil { // beego.Error("下单请求成功 --- 但插入成功后的参数失败") // return nil, err // } // // return payURL, nil // // default: // return nil, errors.New("类型错误") // } //}