package unionpay import ( "fmt" "net/url" "strconv" "git.chuangxin1.com/cx/util" ) func getCustomerV3(ci CustomerInfo) (s string) { s = "{" + ci.CertifTp + "|" s += ci.CertifID + "|" s += ci.CustomerName + "|" s += ci.Phone + "|" s += "|" // SMS message s += "|" // password s += ci.Cvn2 + "|" // cvn2 s += ci.Expired s += "}" return } // V3SendSms 发送验证码(Version 3.0) func V3SendSms(mi *MerchantInfo, ci CustomerInfo, oi OrderInfo) (res ReqRespose, err error) { args := make(map[string]string) args["version"] = "3.0.0" args["encoding"] = "utf-8" args["txnType"] = "77" args["txnSubType"] = "00" args["bizType"] = "000000" args["accessType"] = "0" args["merType"] = "0" args["merId"] = mi.MerID args["merName"] = "" // 商户名称 args["merAbbr"] = "珠海城建公共资源" // 商户简称 args["smsType"] = "" // 短信类型 args["subMerId"] = "" // 二级商户代码 args["subMerName"] = "" // 二级商户名称 args["subMerAbbr"] = "" // 二级商户简称 args["accType"] = "01" args["accNo"] = ci.CardNo // 账号, 不加密 args["orderId"] = oi.OrderID args["txnTime"] = oi.TxnTime args["txnAmt"] = strconv.Itoa(oi.TxnAmt) args["currencyCode"] = "156" args["customerInfo"] = ci.Phone //base64Encode([]byte(getCustomerV3(ci))) args["bindId"] = "" args["reqReserved"] = "" args["reserved"] = "" //args["encryptCertId"] = mi.SerialNumber() args["certId"] = mi.SerialNumber() s := createLinkString(args, true, false) sha1 := util.SHA1(s) var data []byte data, err = signsha1(mi.PrivateKey, []byte(sha1)) if err != nil { return } args["signature"] = base64Encode(data) values := url.Values{} for k, v := range args { values.Add(k, v) } res, err = post(V3BaseHost+V3ReqBackTrans, []byte(values.Encode())) return } // V3Bind 验证绑定卡片(Version 3.0) func V3Bind(mi *MerchantInfo, ci CustomerInfo, oi OrderInfo) (res ReqRespose, err error) { args := make(map[string]string) args["version"] = "3.0.0" args["encoding"] = "utf-8" args["txnType"] = "72" args["txnSubType"] = "01" args["bizType"] = "000000" args["accessType"] = "0" args["merType"] = "0" args["merId"] = mi.MerID args["subMerId"] = "" args["subMerName"] = "" args["orderId"] = oi.OrderID args["txnTime"] = oi.TxnTime args["accType"] = "01" args["accNo"] = ci.CardNo // 账号, 不加密 args["customerInfo"] = base64Encode([]byte(getCustomerV3(ci))) args["bindId"] = ci.CardNo args["riskLevel"] = "" args["bindInfo"] = "" args["reqReserved"] = "" args["reserved"] = "" args["encryptCertId"] = mi.SerialNumber() args["userMac"] = "" args["certId"] = mi.SerialNumber() s := createLinkString(args, true, true) sha1 := util.SHA1(s) var data []byte data, err = signsha1(mi.PrivateKey, []byte(sha1)) if err != nil { return } args["signature"] = base64Encode(data) values := url.Values{} for k, v := range args { values.Add(k, v) } res, err = post(V3BaseHost+V3ReqBackTrans, []byte(values.Encode())) return } // V3Remove 解除绑定卡片(Version 3.0) func V3Remove(mi *MerchantInfo, ci CustomerInfo, oi OrderInfo) (res ReqRespose, err error) { args := make(map[string]string) args["version"] = "3.0.0" args["encoding"] = "utf-8" args["txnType"] = "74" args["txnSubType"] = "00" args["bizType"] = "000000" args["accessType"] = "0" args["merType"] = "0" args["merId"] = mi.MerID args["subMerId"] = "" args["subMerName"] = "" args["orderId"] = oi.OrderID args["txnTime"] = oi.TxnTime //args["accType"] = "01" args["accNo"] = ci.CardNo // 账号, 不加密 //args["customerInfo"] = base64Encode([]byte(getCustomerV3(ci))) args["bindId"] = ci.CardNo args["riskLevel"] = "" //args["bindInfo"] = "" args["reqReserved"] = "" args["reserved"] = "" //args["encryptCertId"] = mi.SerialNumber() //args["userMac"] = "" args["certId"] = mi.SerialNumber() s := createLinkString(args, true, false) sha1 := util.SHA1(s) //sha1 := util.SHA256(s) var data []byte data, err = signsha1(mi.PrivateKey, []byte(sha1)) //data, err = sign(mi.PrivateKey, []byte(sha1)) if err != nil { return } args["signature"] = base64Encode(data) values := url.Values{} for k, v := range args { values.Add(k, v) } res, err = post(V3BaseHost+V3ReqBackTrans, []byte(values.Encode())) return } // V3Charging 代扣(Version 3.0) func V3Charging(mi *MerchantInfo, ci CustomerInfo, oi OrderInfo) (res ReqRespose, err error) { args := make(map[string]string) args["version"] = "3.0.0" args["encoding"] = "utf-8" args["txnType"] = "11" args["txnSubType"] = "00" args["bizType"] = "000000" args["backUrl"] = "" args["accessType"] = "0" args["merType"] = "0" args["merId"] = mi.MerID args["subMerId"] = "" args["subMerName"] = "" args["orderId"] = oi.OrderID args["txnTime"] = oi.TxnTime args["currencyCode"] = "156" // 交易币种 args["accType"] = "01" args["accNo"] = ci.CardNo // 账号, 不加密 args["issInsCode"] = "" // 发卡机构代码 args["customerInfo"] = base64Encode([]byte(getCustomerV3(ci))) args["bindId"] = "" args["riskLevel"] = "" args["txnAmt"] = strconv.Itoa(oi.TxnAmt) args["billType"] = "OT00" // 账单类型 args["billNo"] = "" // 账单号码 args["reqReserved"] = "" args["reserved"] = "" args["customerIp"] = "" args["encryptCertId"] = mi.SerialNumber() args["billPeriod"] = "" // 账单周期 args["certId"] = mi.SerialNumber() s := createLinkString(args, true, true) sha1 := util.SHA1(s) fmt.Println("createLinkString", s) fmt.Println("--", getCustomerV3(ci)) fmt.Println("--", base64Encode([]byte(getCustomerV3(ci)))) fmt.Println("--", s) var data []byte data, err = signsha1(mi.PrivateKey, []byte(sha1)) if err != nil { return } args["signature"] = base64Encode(data) values := url.Values{} for k, v := range args { values.Add(k, v) } fmt.Println("-- body --", values.Encode()) res, err = post(V3BaseHost+V3ReqBackTrans, []byte(values.Encode())) return }