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("类型错误")
//	}
//}