public override void SendRequest() { Dictionary <string, string> data = new Dictionary <string, string>(); BUConfig.MerId = SDKConfig.MerId = this.Vmid; SDKConfig.SignCertPwd = this.Key; SDKConfig.signCertPath = Path.Combine(SDKConfig.validateCertDir, this.SignCertFileName); BUConfig.CertId = CertUtil.GetSignCertId(); data.Add("version", BUConfig.Version); data.Add("encoding", BUConfig.Encoding); data.Add("certId", BUConfig.CertId); data.Add("signMethod", BUConfig.SignMethod); data.Add("txnType", BUConfig.TxnType); data.Add("txnSubType", BUConfig.TxnSubType); data.Add("bizType", BUConfig.BizType); data.Add("channelType", BUConfig.ChannelType); data.Add("frontUrl", BUConfig.FrontUrl); data.Add("backUrl", BUConfig.BackUrl); data.Add("accessType", BUConfig.AccessType); data.Add("merId", BUConfig.MerId); data.Add("orderId", BUConfig.OrderId); data.Add("txnTime", BUConfig.TxnTime); data.Add("txnAmt", BUConfig.TxnAmt); data.Add("currencyCode", BUConfig.CurrencyCode); data.Add("userMac", "userMac"); SDKUtil.Sign(data, Encoding.UTF8); string msg = SDKUtil.CreateAutoSubmitForm("https://gateway.95516.com/gateway/api/frontTransReq.do", data, Encoding.UTF8); PayLog.writeLog(data, "", "", msg, LogType.BankUnion_GateWay); this.SubmitPaymentForm(msg); }
/// <summary> /// 生成App支付订单参数信息 /// </summary> /// <param name="outTradeNo">业务单号</param> /// <param name="subject">支付标题</param> /// <param name="body">支付内容</param> /// <param name="totalFee">支付金额</param> /// <returns></returns> public static UniionpayResult GetPayString(string outTradeNo, string orderDesc, decimal totalAmount, bool isPrePay, out string payParam) { UniionpayResult result = new UniionpayResult(); //构造待签名数据 Dictionary <string, string> param = new Dictionary <string, string>(); try { //填写参数 param["version"] = "5.0.0"; //版本号 param["encoding"] = "UTF-8"; //编码方式 param["certId"] = CertUtil.GetSignCertId(); //证书ID param["txnType"] = isPrePay ? TxnType.PrePay : TxnType.Consume; //交易类型 param["txnSubType"] = "01"; //交易子类 param["bizType"] = "000000"; //业务类型 param["backUrl"] = SDKConfig.BackTransUrl; //后台异步通知地址 param["signMethod"] = "01"; //签名方法,01:表示采用RSA param["channelType"] = "08"; //渠道类型,07-PC,08-手机 param["accessType"] = "0"; //接入类型,0:商户直连接入 1:收单机构接入 2:平台商户接入 param["merId"] = SDKConfig.MerId; //商户号,请改成自己的商户号 param["orderId"] = outTradeNo; //商户订单号 param["txnTime"] = DateTime.Now.ToString("yyyyMMddHHmmss"); //订单发送时间 param["txnAmt"] = (totalAmount * 100).ToString("0"); //交易金额,单位分 param["currencyCode"] = "156"; //交易币种 param["orderDesc"] = orderDesc; //订单描述,可不上送,上送时控件中会显示该信息 SDKUtil.Sign(param, Encoding.UTF8); // 签名 payParam = JsonConvert.SerializeObject(param); // 初始化通信处理类 HttpClient hc = new HttpClient(SDKConfig.AppRequestUrl); // 发送请求获取通信应答 int status = hc.Send(param, Encoding.UTF8); // 返回结果 string results = hc.Result; Dictionary <string, string> resData = SDKUtil.CoverstringToDictionary(results); result.respcode = resData["respCode"]; if (result.respcode != "00") { result.respMsg = resData["respMsg"]; return(result); } if (!SDKUtil.Validate(resData, Encoding.UTF8)) { LogHelper.SaveFileLog("获取银联支付信息失败!", "商户端验证返回报文签名失败:" + JsonConvert.SerializeObject(resData)); result.respMsg = resData["respMsg"]; return(result); } result.tn = resData["tn"]; } catch (Exception ex) { payParam = JsonConvert.SerializeObject(param); LogHelper.SaveFileLog("获取银联支付信息失败!", ex.Message); result.respcode = ""; result.respMsg = ""; } return(result); }
public ChinaUnionViewModel() { Version = "5.0.0"; Encoding = "UTF-8"; CertId = CertUtil.GetSignCertId(); SignMethod = "01"; TxnType = "31"; TxnSubType = "00"; BizType = "000201"; AccessType = "0"; ChannelType = "07"; TxnTime = DateTime.Now.ToString("yyyyMMddHHmmss"); MerId = "898110279910127"; BackUrl = "http://" + HttpContext.Current.Request.Url.Host + "/ChinaUnion/BackReceive"; FrontUrl = "http://" + HttpContext.Current.Request.Url.Host + "/ChinaUnion/FrontUrl"; }
protected void Page_Load(object sender, EventArgs e) { /** * 重要:联调测试时请仔细阅读注释! * * 产品:跳转网关支付产品<br> * 交易:交易状态查询交易:只有同步应答 <br> * 日期: 2015-09<br> * 版本: 1.0.0 * 版权: 中国银联<br> * 说明:以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己需要,按照技术文档编写。该代码仅供参考,不提供编码性能及规范性等方面的保障<br> * 该接口参考文档位置:open.unionpay.com帮助中心 下载 产品接口规范 《网关支付产品接口规范》,<br> * 《平台接入接口规范-第5部分-附录》(内包含应答码接口规范,全渠道平台银行名称-简码对照表)<br> * 测试过程中的如果遇到疑问或问题您可以:1)优先在open平台中查找答案: * 调试过程中的问题或其他问题请在 https://open.unionpay.com/ajweb/help/faq/list 帮助中心 FAQ 搜索解决方案 * 测试过程中产生的6位应答码问题疑问请在https://open.unionpay.com/ajweb/help/respCode/respCodeList 输入应答码搜索解决方案 * 2) 咨询在线人工支持: open.unionpay.com注册一个用户并登陆在右上角点击“在线客服”,咨询人工QQ测试支持。 * 交易说明: 1)对前台交易发起交易状态查询:前台类交易建议间隔(5分、10分、30分、60分、120分)发起交易查询,如果查询到结果成功,则不用再查询。(失败,处理中,查询不到订单均可能为中间状态)。也可以建议商户使用payTimeout(支付超时时间),过了这个时间点查询,得到的结果为最终结果。 * 2)对后台交易发起交易状态查询:后台类资金类交易同步返回00,成功银联有后台通知,商户也可以发起 查询交易,可查询N次(不超过6次),每次时间间隔2N秒发起,即间隔1,2,4,8,16,32S查询(查询到03,04,05继续查询,否则终止查询)。 * 后台类资金类同步返03 04 05响应码及未得到银联响应(读超时)需发起查询交易,可查询N次(不超过6次),每次时间间隔2N秒发起,即间隔1,2,4,8,16,32S查询(查询到03,04,05继续查询,否则终止查询)。 */ Dictionary <string, string> param = new Dictionary <string, string>(); //以下信息非特殊情况不需要改动 param["version"] = "5.0.0"; //版本号 param["encoding"] = "UTF-8"; //编码方式 param["certId"] = CertUtil.GetSignCertId(); //证书ID param["signMethod"] = "01"; //签名方法 param["txnType"] = "00"; //交易类型 param["txnSubType"] = "00"; //交易子类 param["bizType"] = "000000"; //业务类型 param["accessType"] = "0"; //接入类型 param["channelType"] = "07"; //渠道类型 //TODO 以下信息需要填写 param["orderId"] = Request.Form["orderId"].ToString(); //请修改被查询的交易的订单号,8-32位数字字母,不能含“-”或“_”,此处默认取demo演示页面传递的参数 param["merId"] = Request.Form["merId"].ToString(); //商户代码,请改成自己的测试商户号,此处默认取demo演示页面传递的参数 param["txnTime"] = Request.Form["txnTime"].ToString(); //请修改被查询的交易的订单发送时间,格式为YYYYMMDDhhmmss,此处默认取demo演示页面传递的参数 AcpService.Sign(param, System.Text.Encoding.UTF8); // 签名 string url = SDKConfig.SingleQueryUrl; Dictionary <String, String> rspData = AcpService.Post(param, url, System.Text.Encoding.UTF8); Response.Write(DemoUtil.GetPrintResult(url, param, rspData)); if (rspData.Count != 0) { if (AcpService.Validate(rspData, System.Text.Encoding.UTF8)) { Response.Write("商户端验证返回报文签名成功。<br>\n"); string respcode = rspData["respCode"]; //其他应答参数也可用此方法获取 if ("00" == respcode) { string origRespCode = rspData["origRespCode"]; //其他应答参数也可用此方法获取 //处理被查询交易的应答码逻辑 if ("00" == origRespCode) { //交易成功,更新商户订单状态 //TODO Response.Write("交易成功。<br>\n"); } else if ("03" == origRespCode || "04" == origRespCode || "05" == origRespCode) { //需再次发起交易状态查询交易 //TODO Response.Write("稍后查询。<br>\n"); } else { //其他应答码做以失败处理 //TODO Response.Write("交易失败:" + rspData["origRespMsg"] + "。<br>\n"); } } else if ("03" == respcode || "04" == respcode || "05" == respcode) { //不明原因超时,后续继续发起交易查询。 //TODO Response.Write("处理超时,请稍后查询。<br>\n"); } else { //其他应答码做以失败处理 //TODO Response.Write("查询操作失败:" + rspData["respMsg"] + "。<br>\n"); } } } else { Response.Write("请求失败\n"); } }
public ActionResult AppConsume(string txnAmt, string orderDesc) { LogerHelper.DefaultInfo(Request.ToString()); Dictionary <string, string> param = new Dictionary <string, string>(); // 随机构造一个订单号(演示用) Random rnd = new Random(); string orderID = DateTime.Now.ToString("yyyyMMddHHmmss") + (rnd.Next(900) + 100).ToString().Trim(); //填写参数 param["version"] = "5.0.0"; //版本号 param["encoding"] = "UTF-8"; //编码方式 param["certId"] = CertUtil.GetSignCertId(); //证书ID param["txnType"] = "01"; //交易类型 param["txnSubType"] = "01"; //交易子类 param["bizType"] = "000201"; //业务类型 param["frontUrl"] = "http://localhost:8080/demo/utf8/FrontRcvResponse.aspx"; //前台通知地址 ,控件接入方式无作用 param["backUrl"] = "http://weixin.mandelaauto.com/Pay/CupComplete"; //后台通知地址 param["signMethod"] = "01"; //签名方法 param["channelType"] = "08"; //渠道类型,07-PC,08-手机 param["accessType"] = "0"; //接入类型 param["merId"] = Properties.getHost(); //商户号,请改成自己的商户号 param["orderId"] = orderID; //商户订单号 param["txnTime"] = DateTime.Now.ToString("yyyyMMddHHmmss"); //订单发送时间 param["txnAmt"] = txnAmt; //交易金额,单位分 param["currencyCode"] = "156"; //交易币种 param["orderDesc"] = orderDesc; //订单描述,可不上送,上送时控件中会显示该信息 param["reqReserved"] = "透传信息"; //请求方保留域,透传字段,查询、通知、对账文件中均会原样出现 SDKUtil.Sign(param, Encoding.UTF8); // 签名 Response.Write("\n" + "请求报文=[" + SDKUtil.PrintDictionaryToString(param) + "]\n"); // 初始化通信处理类 HttpClient hc = new HttpClient(SDKConfig.AppRequestUrl); //// 发送请求获取通信应答 int status = hc.Send(param, Encoding.UTF8); // 返回结果 string result = hc.Result; if (status == 200) { Response.Write("返回报文=[" + result + "]\n"); LogerHelper.DefaultInfo(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ") + result); Dictionary <string, string> resData = SDKUtil.CoverstringToDictionary(result); foreach (var x in resData.Keys) { LogerHelper.DefaultInfo(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ") + x); } string respcode = resData["respCode"]; if (SDKUtil.Validate(resData, Encoding.UTF8)) { Response.Write("商户端验证返回报文签名成功\n"); } else { Response.Write("商户端验证返回报文签名失败\n"); } } else { Response.Write("请求失败\n"); Response.Write("返回报文=[" + result + "]\n"); } return(Content("success")); }
protected void Page_Load(object sender, EventArgs e) { /** * 重要:联调测试时请仔细阅读注释! * * 产品:无跳转token产品<br> * 交易:申请token号:后台交易<br> * 日期: 2015-11<br> * 版本: 1.0.0 * 版权: 中国银联<br> * 说明:以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己需要,按照技术文档编写。该代码仅供参考,不提供编码性能规范性等方面的保障<br> * 交易说明:根据开通并付款交易的orderId申请,后台同步应答确定交易成功。 */ Dictionary <string, string> param = new Dictionary <string, string>(); // 以下信息需要填写 param["orderId"] = Request.Form["orderId"].ToString(); //商户订单号,填写开通并支付交易的orderId,此处默认取demo演示页面传递的参数 param["merId"] = Request.Form["merId"].ToString(); //商户代码,请改成自己的测试商户号,此处默认取demo演示页面传递的参数 param["txnTime"] = Request.Form["txnTime"].ToString(); //订单发送时间,填写开通并支付交易的txnTime,此处默认取demo演示页面传递的参数 param["tokenPayData"] = "{trId=62000000001&tokenType=01}"; //测试环境固定trId=62000000001&tokenType=01,生产环境由业务分配。测试环境因为所有商户都使用同一个trId,所以同一个卡获取的token号都相同,任一人发起更新token或者解除token请求都会导致原token号失效,所以之前成功、突然出现3900002报错时请先尝试重新开通一下。 // 请求方保留域, // 透传字段,查询、通知、对账文件中均会原样出现,如有需要请启用并修改自己希望透传的数据。 // 出现部分特殊字符时可能影响解析,请按下面建议的方式填写: // 1. 如果能确定内容不会出现&={}[]"'等符号时,可以直接填写数据,建议的方法如下。 //param["reqReserved"] = "透传信息1|透传信息2|透传信息3"; // 2. 内容可能出现&={}[]"'符号时: // 1) 如果需要对账文件里能显示,可将字符替换成全角&={}【】“‘字符(自己写代码,此处不演示); // 2) 如果对账文件没有显示要求,可做一下base64(如下)。 // 注意控制数据长度,实际传输的数据长度不能超过1024位。 // 查询、通知等接口解析时使用System.Text.Encoding.UTF8.GetString(Convert.FromBase64String(reqReserved))解base64后再对数据做后续解析。 //param["reqReserved"] = Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes("任意格式的信息都可以")); //以下信息非特殊情况不需要改动 param["version"] = SDKConfig.Version; //版本号 param["encoding"] = "UTF-8"; //编码方式 param["certId"] = CertUtil.GetSignCertId(); //签名证书ID param["signMethod"] = SDKConfig.SignMethod; //签名方法 param["txnType"] = "79"; //交易类型 param["txnSubType"] = "05"; //交易子类 param["bizType"] = "000902"; //业务类型 param["accessType"] = "0"; //接入类型 param["channelType"] = "07"; //渠道类型 param["encryptCertId"] = CertUtil.GetEncryptCertId(); //加密证书ID AcpService.Sign(param, System.Text.Encoding.UTF8); // 签名 string url = SDKConfig.SingleQueryUrl; Dictionary <String, String> rspData = AcpService.Post(param, url, System.Text.Encoding.UTF8); Response.Write(DemoUtil.GetPrintResult(url, param, rspData)); if (rspData.Count != 0) { if (AcpService.Validate(rspData, System.Text.Encoding.UTF8)) { Response.Write("商户端验证返回报文签名成功。<br>\n"); string respcode = rspData["respCode"]; //其他应答参数也可用此方法获取 if ("00" == respcode) { //申请token成功 //TODO Response.Write("申请token成功。<br>\n"); string tokenPayDataStr = rspData["tokenPayData"]; Dictionary <string, string> tokenPayData = SDKUtil.parseQString(tokenPayDataStr.Substring(1, tokenPayDataStr.Length - 2), System.Text.Encoding.UTF8); if (tokenPayData.ContainsKey("token")) { string token = tokenPayData["token"]; //tokenPayData其他子域均可参考此方式获取 } foreach (KeyValuePair <string, string> pair in tokenPayData) { Response.Write(pair.Key + "=" + pair.Value + "<br>\n"); } } else { //其他应答码做以失败处理 //TODO Response.Write("失败:" + rspData["respMsg"] + "。<br>\n"); } } else { Response.Write("商户端验证返回报文签名失败\n"); } } else { Response.Write("请求失败\n"); } }
public string SearchBankOrder(string CommunityId, string OrderId) { string Result = ""; //SDKConfig con = new SDKConfig(); bool IsConfig = GenerateConfig(CommunityId); if (IsConfig == false) { Result = "未配置证书文件"; return(Result); } IDbConnection conn = new SqlConnection(GetConnection(CommunityId)); string query = "SELECT * FROM Tb_OL_UnionPayOrder WHERE orderId=@OrderId"; Tb_OL_UnionPayOrder T_Order = conn.Query <Tb_OL_UnionPayOrder>(query, new { orderId = OrderId }).SingleOrDefault(); if (T_Order == null) { Result = "未找到该物业订单"; return(Result); } Dictionary <string, string> param = new Dictionary <string, string>(); //以下信息非特殊情况不需要改动 param["version"] = "5.0.0"; //版本号 param["encoding"] = "UTF-8"; //编码方式 param["certId"] = CertUtil.GetSignCertId(s); //证书ID param["signMethod"] = "01"; //签名方法 param["txnType"] = "00"; //交易类型 param["txnSubType"] = "00"; //交易子类 param["bizType"] = "000000"; //业务类型 param["accessType"] = "0"; //接入类型 param["channelType"] = "07"; //渠道类型 //TODO 以下信息需要填写 param["orderId"] = OrderId.ToString(); //请修改被查询的交易的订单号,8-32位数字字母,不能含“-”或“_”,此处默认取demo演示页面传递的参数 param["merId"] = T_Order.merId.ToString(); //商户代码,请改成自己的测试商户号,此处默认取demo演示页面传递的参数 param["txnTime"] = T_Order.txnTime.ToString(); //请修改被查询的交易的订单发送时间,格式为YYYYMMDDhhmmss,此处默认取demo演示页面传递的参数 AcpService.Sign(param, System.Text.Encoding.UTF8, s); // 签名 string url = s.SingleQueryUrl; Dictionary <String, String> rspData = AcpService.Post(param, url, System.Text.Encoding.UTF8, s); if (rspData.Count != 0) { if (AcpService.Validate(rspData, System.Text.Encoding.UTF8, s)) { //商户端验证返回报文签名成功 string respcode = rspData["respCode"]; //其他应答参数也可用此方法获取 if ("00" == respcode) { string origRespCode = rspData["origRespCode"]; //其他应答参数也可用此方法获取 //处理被查询交易的应答码逻辑 if ("00" == origRespCode) { //交易成功,更新商户订单状态 Result = "00"; } else if ("03" == origRespCode || "04" == origRespCode || "05" == origRespCode) { //需再次发起交易状态查询交易 Result = "01"; } else { //交易失败 Result = "交易失败"; } } else if ("03" == respcode || "04" == respcode || "05" == respcode) { //不明原因超时,后续继续发起交易查询。 Result = "01"; } else { //其他应答码做以失败处理 Result = "查询操作失败:" + rspData["respMsg"].ToString(); } } } else { Result = "请求失败"; } return(Result); }