package pay import ( "crypto" "crypto/rand" "crypto/rsa" "crypto/sha256" "crypto/x509" "database/sql" "encoding/base64" "encoding/json" "encoding/pem" "errors" "fmt" "github.com/astaxie/beego/httplib" uID "github.com/satori/go.uuid" "strings" "system_pay/models" "system_pay/mysql" "system_pay/setting" "system_pay/utils" ) // 拉卡拉支付 func UnifiedOrder(input *models.PlaceAnOrderParamInput, ip string) (interface{}, error) { //if input.ChainCode=="" || input.HospitalCode=="" || input.VendorId=="" || seller_id=="" { // return nil, errors.New("输入项为空") //} fmt.Println("谛宝多多输入参数") fmt.Println(input) orderID := GetUID() //beego.Info("AttachInfo: ", input.AttachInfo) attachMap := make(map[string]interface{}, 0) attachMap["store_sn"] = input.StoreSn attachMap["old_attach"] = input.AttachInfo attach, _ := json.Marshal(attachMap) input.AttachInfo = string(attach) // 插入数据库 db, err := mysql.NewPayConn() if err != nil { return 0, err } tx, err := db.Begin() if err != nil { return nil, err } defer mysql.CloseTx(tx, err) billID, err := InsertPayBill(tx, input, orderID) if err != nil { return nil, err } //数据重组 - start data := make(map[string]interface{}) var url string if false { //聚合收银台(微信H5+支付宝H5) url = "https://test.wsmsd.cn/sit/api/v3/ccss/counter/order/create" //聚合收银台 data["req_time"] = "20230626100000" data["version"] = "3.0" data["out_org_code"] = "OP00000003" //input.ReturnURL = "https://test.pet-dbc.cn" // 构造回调url input.NoticeURL = GetNoticeURL(input.SourceCode) // 传递给支付渠道的 //p.ServeNoticeUrl = noticeURLx data2 := make(map[string]interface{}) //data2["merchant_no"] = "8222900701107M5" data2["merchant_no"] = "8221210701101SB" data2["term_no"] = "29034705" //data2["total_amount"] = "1" data2["total_amount"] = input.GoodsPrice //data2["out_trade_no"] = orderID //随机生成的订单号 //商户交易流水号 //data2["out_trade_no"] = RandomString(32) data2["out_order_no"] = orderID //随机生成的订单号 //商户订单号 //data2["out_order_no"] = RandomString(32) //data2["out_trade_no"] = input.AttachInfo //data2["out_order_no"] = input.AttachInfo data2["counter_param"] = "{\"pay_mode\":\"ALIPAY\"}" //data2["counter_param"] = "{\"pay_mode\":\"WECHAT\"}" data2["order_efficient_time"] = "20230630235959" //订单有效期 格式yyyyMMddHHmmss,最大支持下单时间+2天 data2["notify_url"] = input.NoticeURL //订单支付成功后商户接收订单通知的地址 http://xxx.xxx.com data2["callback_url"] = input.ReturnURL //客户端下单完成支付后返回的商户网页跳转地址 data2["order_info"] = "必康测试订单标题2" //订单标题,在使用收银台扫码支付时必输入,交易时送往账户端 //data2["goods_mark"] = input.AttachInfo //商品信息标识 (1:含商品信息,不填默认不含商品信息) data["req_data"] = make(map[string]interface{}) data["req_data"] = data2 } else { //聚合主扫(微信JSAPI+微信小程序) url = "https://test.wsmsd.cn/sit/api/v3/labs/trans/preorder" //聚合主扫 data["req_time"] = "20230626100000" data["version"] = "3.0" data["out_org_code"] = "OP00000003" //input.ReturnURL = "https://test.pet-dbc.cn" // 构造回调url input.NoticeURL = GetNoticeURL(input.SourceCode) // 传递给支付渠道的 //p.ServeNoticeUrl = noticeURLx data2 := make(map[string]interface{}) //data2["merchant_no"] = "8222900701107M5" data2["merchant_no"] = "8221210701101SB" data2["term_no"] = "29034705" //data2["total_amount"] = "1" data2["total_amount"] = input.GoodsPrice data2["out_trade_no"] = orderID //随机生成的订单号 //商户交易流水号 //data2["out_trade_no"] = RandomString(32) //data2["out_order_no"] = orderID //随机生成的订单号 //商户订单号 //data2["out_order_no"] = RandomString(32) //data2["out_trade_no"] = input.AttachInfo //data2["out_order_no"] = input.AttachInfo //data2["counter_param"] = "{\"pay_mode\":\"ALIPAY\"}" data2["counter_param"] = "{\"pay_mode\":\"WECHAT\"}" data2["order_efficient_time"] = "20230630235959" //订单有效期 格式yyyyMMddHHmmss,最大支持下单时间+2天 data2["notify_url"] = input.NoticeURL //订单支付成功后商户接收订单通知的地址 http://xxx.xxx.com data2["callback_url"] = input.ReturnURL //客户端下单完成支付后返回的商户网页跳转地址 data2["order_info"] = "必康测试订单标题2" //订单标题,在使用收银台扫码支付时必输入,交易时送往账户端 //data2["goods_mark"] = input.AttachInfo //商品信息标识 (1:含商品信息,不填默认不含商品信息) data2["account_type"] = "WECHAT" //钱包类型 data2["trans_type"] = "51" //接入方式 //地址位置信息 data3 := make(map[string]interface{}) data3["request_ip"] = ip data2["location_info"] = make(map[string]interface{}) data2["location_info"] = data3 data["req_data"] = make(map[string]interface{}) data["req_data"] = data2 } //数据重组 - end fmt.Println("拉卡拉输入参数") fmt.Println(data) fmt.Println("拉卡拉接口url") fmt.Println(url) // 插入下单请求参数 err = InsertPayBillDetailRequestBody(tx, billID, data) if err != nil { return nil, err } data_json, err := json.Marshal(data) if err != nil { //this.Data["json"] = utils.CheckError(errors.New("Map转化为byte数组失败"),"异常") //this.ServeJSON() return nil, err } //url := "https://test.wsmsd.cn/sit/api/v3/labs/trans/preorder" //聚合主扫 //url := "https://test.wsmsd.cn/sit/api/v3/labs/trans/micropay" //聚合被扫 //url := "https://test.wsmsd.cn/sit/api/v3/ccss/counter/order/create" //聚合收银台 //调拉卡拉接口 err, m_web_url, lakala_rtn := lakala_post(url, data_json) if err != nil { InsertPayBillDetailResponseBody(tx, billID, lakala_rtn) return nil, err } response := make(map[string]string) response["m_web_url"] = m_web_url // 插入下单成功后返回的参数 err = InsertPayBillDetailResponseBody(tx, billID, lakala_rtn) if err != nil { //beego.Error("下单请求成功 --- 但插入成功后的参数失败") return nil, err } return response, nil } func lakala_post(url string, data_json []byte) (error, string, interface{}) { authorization, err := getAuthorization(string(data_json)) if err != nil { return err, "", nil } 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, "", nil } temp := make(map[string]interface{}, 0) if err = json.Unmarshal(body, &temp); err != nil { return err, "", nil } 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)), "", temp } //return nil, temp["resp_data"]["counter_url"] temp2, _ := temp["resp_data"].(map[string]interface{}) if temp2["counter_url"]=="" { return errors.New("拉卡拉返回值「counter_url」为空错误"), "", temp } return nil, temp2["counter_url"].(string), temp } 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) fmt.Println("签名1:", signature) base64Sig, err := utils.RSASign([]byte(message), "./cert/OP00000003_private_key.pem") if err != nil { return signature, err } fmt.Println("签名2:", base64Sig) err = utils.RSAVerify([]byte(message), base64Sig, "./cert/OP00000003_cert.cer") if err == nil { fmt.Println("验证成功!") } else { fmt.Println("验证失败!") return "", err } return "", errors.New("wangpei签名测试中。。。。。") 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(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 } // GetNoticeURL is 获取回调地址 func GetNoticeURL(sourceCode uint8) string { //domainName := beego.AppConfig.String("DomainName") domainName := setting.Conf.PayUrl.DomainName //domainName = "http://tpay-v2.pet-dbc.cn:14880"; return domainName + "/api/v1/pay/wx_notice" // <= 5 是微信 if sourceCode < 5 { return domainName + "/api/v1/pay/wx_notice" } // > 5 是支付宝 return domainName + "/api/v1/pay/alipay_notice" // //if isServe == 0 { // // payType 1: 原生 2: paymax // if payType == 1 { // // // <= 5 是微信 > 5 是支付宝 // if sourceCode < 5 { // return domainName + "/v1/notice/wx" // } // // return domainName + "/v1/notice/ali" // } // // return domainName + "/v1/notice/paymax" //} // //// <= 5 是微信 > 5 是支付宝 //if sourceCode < 5 { // return domainName + "/v1/notice/serve_wx" //} // //return domainName + "/v1/notice/serve_ali" } // BillPayStateSuccess is 微信回调后 把订单状态 置为结算成功 func BillPayStateSuccess(tx *sql.Tx, billID int64) error { insertPayBillDetailSQL := `update system_pay_bill set result_code = 1 where id = ?` result, err := tx.Exec(insertPayBillDetailSQL, billID) if err != nil { return err } _, err = result.RowsAffected() if err != nil { return err } return nil } // BillPayStateFail is 微信回调后 把订单状态 置为结算失败 func BillPayStateFail(tx *sql.Tx, billID int64) error { insertPayBillDetailSQL := `update system_pay_bill set result_code = 2 where id = ?` result, err := tx.Exec(insertPayBillDetailSQL, billID) if err != nil { return err } _, err = result.RowsAffected() if err != nil { return err } return nil } //InsertPayBill is 插入 支付订单表中 func InsertPayBill(tx *sql.Tx, p *models.PlaceAnOrderParamInput, orderID string) (int64, error) { var billID int64 insertSQL := `insert system_pay_bill set platform_type = ?, platform_info = ?, source_code = ?, payment_order_code = ?, paymoney = ?*1000, commodity_describe = ?, commodity_detail = ?, attach = ?, notify_pay_url = ?, pay_type = ?, is_serve = ?` result, err := tx.Exec(insertSQL, p.PlatformType, p.PlatformInfo, p.SourceCode, orderID, p.GoodsPrice, p.GoodsDes, p.GoodsDetail, p.AttachInfo, p.NoticeURL, p.PayType, p.IsServe) if err != nil { return billID, err } billID, err = result.LastInsertId() if err != nil { return billID, err } return billID, nil } // InsertPayBillDetailRequestBody is 插入支付订单详情表中的 下单参数字段 request_body func InsertPayBillDetailRequestBody(tx *sql.Tx, billID int64, requestBody interface{}) error { body, err := json.Marshal(requestBody) if err != nil { return err } insertPayBillDetailSQL := `insert system_pay_bill_detail set pay_bill_id = ?, request_body = ?` result, err := tx.Exec(insertPayBillDetailSQL, billID, string(body)) if err != nil { return err } _, err = result.LastInsertId() if err != nil { return err } return nil } // InsertPayBillDetailResponseBody is 插入支付订单详情表中的 下单参数字段 response_body func InsertPayBillDetailResponseBody(tx *sql.Tx, billID int64, responseBody interface{}) error { body, err := json.Marshal(responseBody) if err != nil { return err } insertPayBillDetailSQL := `update system_pay_bill_detail set response_body = ? where pay_bill_id = ?` result, err := tx.Exec(insertPayBillDetailSQL, string(body), billID) if err != nil { return err } _, err = result.RowsAffected() if err != nil { return err } return nil } func InsertPayBillDetailResponseBodyString(tx *sql.Tx, billID int64, responseBody string) error { insertPayBillDetailSQL := `update system_pay_bill_detail set response_body = ? where pay_bill_id = ?` result, err := tx.Exec(insertPayBillDetailSQL, responseBody, billID) if err != nil { return err } _, err = result.RowsAffected() if err != nil { return err } return nil } func GetUID() string { u4 := uID.NewV4() //if err != nil { // return "" //} id := fmt.Sprintf("%s", u4) return strings.Replace(id, "-", "", -1) } //生产随机字符串 //func RandomString(n int) string { // var letters = []byte("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz") // result := make([]byte, n) // rand2.Seed(time.Now().Unix()) // for i := range result { // result[i] = letters[rand2.Intn(len(letters))] // } // return string(result) //} //聚合被扫 func UnifiedOrder2(input *models.PlaceAnOrderParamInput) (interface{}, error) { //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" //扫码支付授权码,设备读取用户APP中的条码或者二维码信息,用户付款码条形码规则见说明 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 nil, err } //url := "https://test.wsmsd.cn/sit/api/v3/labs/trans/preorder" //聚合主扫 url := "https://test.wsmsd.cn/sit/api/v3/labs/trans/micropay" //聚合被扫 //url := "https://test.wsmsd.cn/sit/api/v3/ccss/counter/order/create" //聚合收银台 //调拉卡拉接口 err, _, _ = lakala_post(url, data_json) if err != nil { //this.Data["json"] = utils.CheckError(err,"拉卡拉错误") //this.ServeJSON() return nil, err } return nil, nil //response := make(map[string]string) //response["m_web_url"] = m_web_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() }