private void initParams(int money) { Dictionary <string, string> param = new Dictionary <string, string>(); param["version"] = "5.0.0"; //版本号 param["encoding"] = "UTF-8"; //编码方式 param["txnType"] = "01"; //交易类型 param["txnSubType"] = "01"; //交易子类 param["bizType"] = "000201"; //业务类型 param["signMethod"] = "01"; //签名方法 param["channelType"] = "08"; //渠道类型 param["accessType"] = "0"; //接入类型 param["frontUrl"] = SDKConfig.FrontUrl; //前台通知地址 param["backUrl"] = SDKConfig.BackUrl; //后台通知地址 param["currencyCode"] = "156"; //交易币种 string orderId = generateOrderSeriesNum(); string time = DateTime.Now.ToString("yyyyMMddHHmmss"); GetUData.OrderId = orderId; GetUData.Timestamp = time; param["merId"] = "777290058131265"; //商户号,请改自己的测试商户号,此处默认取demo演示页面传递的参数 param["orderId"] = orderId; //商户订单号,8-32位数字字母,不能含“-”或“_”,此处默认取demo演示页面传递的参数,可以自行定制规则 param["txnTime"] = time; //订单发送时间,格式为YYYYMMDDhhmmss,取北京时间,此处默认取demo演示页面传递的参数,参考取法: DateTime.Now.ToString("yyyyMMddHHmmss") param["txnAmt"] = money.ToString(); //交易金额,单位分,此处默认取demo演示页面传递的参数 addOrderInfo(orderId, (money / 100).ToString()); AcpService.Sign(param, System.Text.Encoding.UTF8); string html = AcpService.CreateAutoFormHtml(SDKConfig.FrontTransUrl, param, System.Text.Encoding.UTF8); // 将SDKUtil产生的Html文档写入页面,从而引导用户浏览器重定向 Response.ContentEncoding = Encoding.UTF8; // 指定输出编码 Response.Write(html); }
public string BuildPaymentForm() { Dictionary <string, string> param = new Dictionary <string, string>(); //以下信息非特殊情况不需要改动 param["version"] = "5.0.0"; //版本号 param["encoding"] = "UTF-8"; //编码方式 param["txnType"] = "01"; //交易类型 param["txnSubType"] = "01"; //交易子类 param["bizType"] = "000201"; //业务类型 param["signMethod"] = "01"; //签名方法 param["channelType"] = "08"; //渠道类型 param["accessType"] = "0"; //接入类型 param["frontUrl"] = Merchant.NotifyUrl.ToString(); //前台通知地址 param["backUrl"] = Merchant.ReturnUrl.ToString(); //后台通知地址 param["currencyCode"] = "156"; //交易币种 //TODO 以下信息需要填写 param["merId"] = Merchant.Partner; //商户号,请改自己的测试商户号,此处默认取demo演示页面传递的参数 param["orderId"] = Order.OrderNo; //商户订单号,8-32位数字字母,不能含“-”或“_”,此处默认取demo演示页面传递的参数,可以自行定制规则 param["txnTime"] = Order.PaymentDate.ToString("yyyyMMddHHmmss"); //订单发送时间,格式为YYYYMMDDhhmmss,取北京时间,此处默认取demo演示页面传递的参数,参考取法: DateTime.Now.ToString("yyyyMMddHHmmss") param["txnAmt"] = (Order.OrderAmount * 100).ToString(); //交易金额,单位分,此处默认取demo演示页面传递的参数 //param["reqReserved"] = "透传信息";//请求方保留域,透传字段,查询、通知、对账文件中均会原样出现,如有需要请启用并修改自己希望透传的数据 //TODO 其他特殊用法请查看 pages/api_01_gateway/special_use_purchase.htm AcpService.Sign(param, System.Text.Encoding.UTF8); string html = AcpService.CreateAutoFormHtml(SDKConfig.FrontTransUrl, param, System.Text.Encoding.UTF8); // 将SDKUtil产生的Html文档写入页面,从而引导用户浏览器重定向 System.Web.HttpContext.Current.Response.ContentEncoding = Encoding.UTF8; // 指定输出编码 return(html); }
/// <summary> /// 网银 /// </summary> /// <returns></returns> public ActionResult UnionpayPcPay() { /** * 重要:联调测试时请仔细阅读注释! * * 产品:跳转网关支付产品<br> * 交易:消费:前台跳转,有前台通知应答和后台通知应答<br> * 日期: 2015-09<br> * 版本: 1.0.0 * 版权: 中国银联<br> * 说明:以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己需要,按照技术文档编写。该代码仅供参考,不提供编码性能规范性等方面的保障<br> * 提示:该接口参考文档位置:open.unionpay.com帮助中心 下载 产品接口规范 《网关支付产品接口规范》,<br> * 《平台接入接口规范-第5部分-附录》(内包含应答码接口规范,全渠道平台银行名称-简码对照表)<br> * 《全渠道平台接入接口规范 第3部分 文件接口》(对账文件格式说明)<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)以后台通知或交易状态查询交易确定交易成功,前台通知不能作为判断成功的标准. * 2)交易状态查询交易(Form_6_5_Query)建议调用机制:前台类交易建议间隔(5分、10分、30分、60分、120分)发起交易查询,如果查询到结果成功,则不用再查询。(失败,处理中,查询不到订单均可能为中间状态)。也可以建议商户使用payTimeout(支付超时时间),过了这个时间点查询,得到的结果为最终结果。 */ Dictionary <string, string> param = new Dictionary <string, string>(); //以下信息非特殊情况不需要改动 param["version"] = "5.0.0"; //版本号 param["encoding"] = "UTF-8"; //编码方式 param["txnType"] = "01"; //交易类型 param["txnSubType"] = "01"; //交易子类 param["bizType"] = "000201"; //业务类型 param["signMethod"] = "01"; //签名方法 param["channelType"] = "08"; //渠道类型 param["accessType"] = "0"; //接入类型 param["frontUrl"] = SDKConfig.FrontUrl; //前台通知地址 param["backUrl"] = SDKConfig.BackUrl; //后台通知地址 param["currencyCode"] = "156"; //交易币种 //获取订单信息 //var order = await _cmsOrderLogic.GetByIdAsync(Request.Form["hiddenOrderId"]); //TODO 以下信息需要填写 param["merId"] = Request.Form["merId"]; //商户号,请改自己的测试商户号,此处默认取demo演示页面传递的参数 //param["hiddenOrderId"] = Request.Form["hiddenOrderId"]; param["orderId"] = Request.Form["orderId"]; //商户订单号,8-32位数字字母,不能含“-”或“_”,此处默认取demo演示页面传递的参数,可以自行定制规则 param["txnTime"] = Request.Form["txnTime"]; //订单发送时间,格式为YYYYMMDDhhmmss,取北京时间,此处默认取demo演示页面传递的参数,参考取法: DateTime.Now.ToString("yyyyMMddHHmmss") param["txnAmt"] = (Convert.ToDecimal(0.01 * 100).ToString("#.##")); //交易金额,单位分,此处默认取demo演示页面传递的参数 if (param["txnAmt"] == "") // 如果为空或者小于0.01那么默认为0.01 { param["txnAmt"] = "1"; } //param["reqReserved"] = "透传信息";//请求方保留域,透传字段,查询、通知、对账文件中均会原样出现,如有需要请启用并修改自己希望透传的数据 //TODO 其他特殊用法请查看 pages/api_01_gateway/special_use_purchase.htm AcpService.Sign(param, Encoding.UTF8); string html = AcpService.CreateAutoFormHtml(SDKConfig.FrontTransUrl, param, Encoding.UTF8); // 将SDKUtil产生的Html文档写入页面,从而引导用户浏览器重定向 Response.ContentEncoding = Encoding.UTF8; // 指定输出编码 return(Content(html)); }
public Dictionary <string, string> BuildPayParams() { //组装请求报文 Dictionary <string, string> param = new Dictionary <string, string>(); // 版本号 param.Add("version", "5.0.0"); // 字符集编码 默认"UTF-8" param.Add("encoding", "UTF-8"); // 签名方法 01 RSA param.Add("signMethod", "01"); // 交易类型 01-消费 param.Add("txnType", "01"); // 交易子类型 01:自助消费 02:订购 03:分期付款 param.Add("txnSubType", "01"); // 业务类型 param.Add("bizType", "000201"); // 渠道类型,07-PC,08-手机 param.Add("channelType", "08"); // 前台通知地址 ,控件接入方式无作用 param.Add("frontUrl", Merchant.ReturnUrl.ToString()); // 后台通知地址 param.Add("backUrl", Merchant.NotifyUrl.ToString()); // 接入类型,商户接入填0 0- 商户 , 1: 收单, 2:平台商户 param.Add("accessType", "0"); // 商户号码,请改成自己的商户号 param.Add("merId", Merchant.Partner); // 商户订单号,8-40位数字字母 param.Add("orderId", Order.OrderNo); // 订单发送时间,取系统时间 param.Add("txnTime", Order.PaymentDate.ToString("yyyyMMddHHmmss")); // 交易金额,单位分 param.Add("txnAmt", (Order.OrderAmount * 100).ToString()); // 交易币种 param.Add("currencyCode", "156"); // 请求方保留域,透传字段,查询、通知、对账文件中均会原样出现 // param.Add("reqReserved", "透传信息"); // 订单描述,可不上送,上送时控件中会显示该信息 // param.Add("orderDesc", "订单描述"); AcpService.Sign(param, Encoding.UTF8); Dictionary <String, String> resmap = AcpService.Post(param, SDKConfig.AppRequestUrl, Encoding.UTF8); Dictionary <string, string> resParam = new Dictionary <string, string>(); resParam.Add("tn", resmap["tn"]); return(resParam); }
protected void Page_Load(object sender, EventArgs e) { /** * 重要:联调测试时请仔细阅读注释! * * 产品:跳转网关支付产品<br> * 交易:预授权:前台跳转,有前台通知应答和后台通知应答<br> * 日期: 2015-09<br> * * 版权: 中国银联<br> * 说明:以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己需要,按照技术文档编写。该代码仅供参考,不提供编码性能规范性等方面的保障<br> * 提示:该接口参考文档位置:open.unionpay.com帮助中心 下载 产品接口规范 《网关支付产品接口规范》,<br> * 《平台接入接口规范-第5部分-附录》(内包含应答码接口规范,全渠道平台银行名称-简码对照表)<br> * 《全渠道平台接入接口规范 第3部分 文件接口》(对账文件格式说明)<br> * 测试过程中的如果遇到疑问或问题您可以:1)优先在open平台中查找答案: * 调试过程中的问题或其他问题请在 https://open.unionpay.com/ajweb/help/faq/list 帮助中心 FAQ 搜索解决方案 * 测试过程中产生的7位应答码问题疑问请在https://open.unionpay.com/ajweb/help/respCode/respCodeList 输入应答码搜索解决方案 * 2) 咨询在线人工支持: open.unionpay.com注册一个用户并登陆在右上角点击“在线客服”,咨询人工QQ测试支持。 * 交易说明:1)以后台通知或交易状态查询交易确定交易成功,前台通知不能作为判断成功的标准. * 2)交易状态查询交易(Form_6_5_Query)建议调用机制:前台类交易间隔(5分、10分、30分、60分、120分)发起交易查询,如果查询到结果成功,则不用再查询。(失败,处理中,查询不到订单均可能为中间状态)。也可以建议商户使用payTimeout(支付超时时间),过了这个时间点查询,得到的结果为最终结果。 */ Dictionary <string, string> param = new Dictionary <string, string>(); //以下信息非特殊情况不需要改动 param["version"] = SDKConfig.Version; //版本号 param["encoding"] = "UTF-8"; //编码方式 param["txnType"] = "02"; //交易类型 param["txnSubType"] = "01"; //交易子类 param["bizType"] = "000201"; //业务类型 param["signMethod"] = SDKConfig.SignMethod; //签名方法 param["channelType"] = "08"; //渠道类型 param["accessType"] = "0"; //接入类型 param["frontUrl"] = SDKConfig.FrontUrl; //前台通知地址 param["backUrl"] = SDKConfig.BackUrl; //后台通知地址 param["currencyCode"] = "156"; //交易币种 // 订单超时时间。 // 超过此时间后,除网银交易外,其他交易银联系统会拒绝受理,提示超时。 跳转银行网银交易如果超时后交易成功,会自动退款,大约5个工作日金额返还到持卡人账户。 // 此时间建议取支付时的北京时间加15分钟。 // 超过超时时间调查询接口应答origRespCode不是A6或者00的就可以判断为失败。 param["payTimeout"] = DateTime.Now.AddMinutes(15).ToString("yyyyMMddHHmmss"); //TODO 以下信息需要填写 param["merId"] = Request.Form["merId"].ToString(); //商户号,请改自己的测试商户号,此处默认取demo演示页面传递的参数 param["orderId"] = Request.Form["orderId"].ToString(); //商户订单号,8-32位数字字母,不能含“-”或“_”,此处默认取demo演示页面传递的参数,可以自行定制规则 param["txnTime"] = Request.Form["txnTime"].ToString(); //订单发送时间,格式为YYYYMMDDhhmmss,取北京时间,此处默认取demo演示页面传递的参数,参考取法: DateTime.Now.ToString("yyyyMMddHHmmss") param["txnAmt"] = Request.Form["txnAmt"].ToString(); //交易金额,单位分,此处默认取demo演示页面传递的参数 // 请求方保留域, // 透传字段,查询、通知、对账文件中均会原样出现,如有需要请启用并修改自己希望透传的数据。 // 出现部分特殊字符时可能影响解析,请按下面建议的方式填写: // 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["riskRateInfo"] = "{commodityName=测试商品名称}";// //TODO 其他特殊用法请查看 pages/api_01_gateway/special_use_preauth.htm AcpService.Sign(param, System.Text.Encoding.UTF8); string html = AcpService.CreateAutoFormHtml(SDKConfig.FrontTransUrl, param, System.Text.Encoding.UTF8); // 将SDKUtil产生的Html文档写入页面,从而引导用户浏览器重定向 Response.ContentEncoding = Encoding.UTF8; // 指定输出编码 Response.Write(html); }
protected void Page_Load(object sender, EventArgs e) { /** * 重要:联调测试时请仔细阅读注释! * * 产品:跳转网关支付产品<br> * 交易:文件传输类接口:后台获取对账文件交易,只有同步应答 <br> * 日期: 2015-09<br> * 版本: 1.0.0 * 版权: 中国银联<br> * 说明:以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己需要,按照技术文档编写。该代码仅供参考,不提供编码性能规范性等方面的保障<br> * 该接口参考文档位置:open.unionpay.com帮助中心 下载 产品接口规范 《网关支付产品接口规范》<br> * 《平台接入接口规范-第5部分-附录》(内包含应答码接口规范,全渠道平台银行名称-简码对照表)<br> * 《全渠道平台接入接口规范 第3部分 文件接口》(对账文件格式说明)<br> * 测试过程中的如果遇到疑问或问题您可以:1)优先在open平台中查找答案: * 调试过程中的问题或其他问题请在 https://open.unionpay.com/ajweb/help/faq/list 帮助中心 FAQ 搜索解决方案 * 测试过程中产生的7位应答码问题疑问请在https://open.unionpay.com/ajweb/help/respCode/respCodeList 输入应答码搜索解决方案 * 2) 咨询在线人工支持: open.unionpay.com注册一个用户并登陆在右上角点击“在线客服”,咨询人工QQ测试支持。 * 交易说明: 对账文件的格式请参考《全渠道平台接入接口规范 第3部分 文件接口》 * 对账文件示例见目录assets/对账文件样例下的802310048993424_20150905.zip * 解析落地后的对账文件可以参考BaseDemo.java中的parseZMFile();parseZMEFile();方法 */ Dictionary <string, string> param = new Dictionary <string, string>(); //以下信息非特殊情况不需要改动 param["version"] = SDKConfig.Version; //版本号 param["encoding"] = "UTF-8"; //编码方式 param["signMethod"] = SDKConfig.SignMethod; //签名方法 param["txnType"] = "76"; //交易类型 param["txnSubType"] = "01"; //交易子类 param["bizType"] = "000000"; //业务类型 param["accessType"] = "0"; //接入类型 param["channelType"] = "07"; //渠道类型 param["fileType"] = "00"; //文件类型 //TODO 以下信息需要填写 param["merId"] = Request.Form["merId"].ToString(); param["merId"] = Request.Form["merId"].ToString(); //商户代码,请改成自己的测试商户号,此处默认取demo演示页面传递的参数 param["txnTime"] = Request.Form["txnTime"].ToString(); //订单发送时间,取北京时间,格式为YYYYMMDDhhmmss,此处默认取demo演示页面传递的参数 param["settleDate"] = Request.Form["settleDate"].ToString(); //清算日期,格式为MMDD,此处默认取demo演示页面传递的参数 AcpService.Sign(param, System.Text.Encoding.UTF8); // 签名 string url = SDKConfig.FileTransUrl; Dictionary <String, String> rspData = AcpService.Post(param, url, System.Text.Encoding.UTF8); Response.Write(DemoUtil.GetPrintResult(url, param, rspData)); if (rspData.Count == 0) { Response.Write("请求失败<br>\n"); return; } if (!AcpService.Validate(rspData, System.Text.Encoding.UTF8)) //验签 { Response.Write("商户端验证返回报文签名失败。<br>\n"); return; } Response.Write("商户端验证返回报文签名成功。<br>\n"); string respcode = rspData["respCode"]; //其他应答参数也可用此方法获取 if ("98" == respcode) { //TODO 文件不存在 Response.Write("文件不存在。<br>\n"); return; } else if ("00" != respcode) { //TODO 其他应答码做以失败处理 Response.Write("失败:respcode=" + respcode + "。<br>\n"); return; } Response.Write("返回成功。<br>\n"); // 解析返回文件 string fileContent = rspData["fileContent"]; if (string.IsNullOrEmpty(fileContent)) { Response.Write("fileContent为空,正常不会出现,请确定是否调错接口?<br>\n"); return; } //Base64解码 byte[] dBase64Byte = Convert.FromBase64String(fileContent); //解压缩 byte[] fileByte = SecurityUtil.Inflater(dBase64Byte); string filePath = "D:/file/"; //TODO 【重要】请先确保此路径存在,且有权限写入 if (AcpService.DeCodeFileContent(rspData, filePath)) { Response.Write("文件成功保存到" + filePath + "目录下。<br>\n"); } else { Response.Write("文件保存失败,请看下日志文件中的报错信息。<br>\n"); } //================================================================= //TODO 下面是调用的方法是分析对账文件的样例代码,请按照自己的需要修改并集成到自己的代码中 analyzeFile(filePath, rspData["fileName"]); }
protected void Page_Load(object sender, EventArgs e) { /** * 重要:联调测试时请仔细阅读注释! * * 产品:无跳转产品<br> * 交易:后台开通:后台交易,只有同步应答<br> * 日期: 2015-11<br> * 版本: 1.0.0 * 版权: 中国银联<br> * 说明:以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己需要,按照技术文档编写。该代码仅供参考,不提供编码性能规范性等方面的保障<br> * 该接口参考文档位置:open.unionpay.com帮助中心 下载 产品接口规范 《代收产品接口规范》<br> * 《平台接入接口规范-第5部分-附录》(内包含应答码接口规范)<br> * 测试过程中的如果遇到疑问或问题您可以:1)优先在open平台中查找答案: * 调试过程中的问题或其他问题请在 https://open.unionpay.com/ajweb/help/faq/list 帮助中心 FAQ 搜索解决方案 * 测试过程中产生的7位应答码问题疑问请在https://open.unionpay.com/ajweb/help/respCode/respCodeList 输入应答码搜索解决方案 * 2) 咨询在线人工支持: open.unionpay.com注册一个用户并登陆在右上角点击“在线客服”,咨询人工QQ测试支持。 * 交易说明:同步交易,不需要接收后台通知或发起交易状态查询交易,同步应答确定交易成功。 */ Dictionary <string, string> param = new Dictionary <string, string>(); // 以下信息需要填写 param["orderId"] = Request.Form["orderId"].ToString(); //商户订单号,8-32位数字字母,可按自己规则产生,如上送短信验证码,请填写获取验证码时一样的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报错时请先尝试重新开通一下。 //支付卡信息填写 //贷记卡 必送:卡号、手机号、CVN2、有效期;验证码看业务配置(默认不要短信验证码)。 //借记卡 必送:卡号、手机号;选送:证件类型+证件号、姓名;验证码看业务配置(默认不要短信验证码)。 string accNo = "6226388000000095"; //卡号 Dictionary <string, string> customerInfo = new Dictionary <string, string>(); customerInfo["phoneNo"] = "18100000000"; //手机号 //customerInfo["certifTp"] = "01"; //证件类型,01-身份证 //customerInfo["certifId"] = "510265790128303"; //证件号,15位身份证不校验尾号,18位会校验尾号,请务必在前端写好校验代码 //customerInfo["customerNm"] = "张三"; //姓名 customerInfo["cvn2"] = "248"; //cvn2 customerInfo["expired"] = "1912"; //有效期,YYMM格式,持卡人卡面印的是MMYY的,请注意代码设置倒一下 customerInfo["smsCode"] = "111111"; //短信验证码 //param["accNo"] = accNo; //卡号,旧规范请按此方式填写 //param["customerInfo"] = AcpService.GetCustomerInfo(customerInfo, System.Text.Encoding.UTF8); //持卡人身份信息,旧规范请按此方式填写 param["accNo"] = AcpService.EncryptData(accNo, System.Text.Encoding.UTF8); //卡号,新规范请按此方式填写 param["customerInfo"] = AcpService.GetCustomerInfoWithEncrypt(customerInfo, System.Text.Encoding.UTF8); //持卡人身份信息,新规范请按此方式填写 // 请求方保留域, // 透传字段,查询、通知、对账文件中均会原样出现,如有需要请启用并修改自己希望透传的数据。 // 出现部分特殊字符时可能影响解析,请按下面建议的方式填写: // 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["signMethod"] = SDKConfig.SignMethod; //签名方法 param["txnType"] = "79"; //交易类型 param["txnSubType"] = "00"; //交易子类 param["bizType"] = "000902"; //业务类型 param["accessType"] = "0"; //接入类型 param["channelType"] = "07"; //渠道类型 param["encryptCertId"] = AcpService.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) { //后台开通成功 //TODO Response.Write("后台开通成功。<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"); } }
/// <summary> /// 生成银行订单 /// </summary> /// <param name="merId">商户号</param> /// <param name="orderId">订单ID</param> /// <param name="txnTime">订单时间</param> /// <param name="txtAmt">总金额分</param> /// <param name="R">是否成功生成银行订单</param> /// <returns></returns> public string GenerateBankOrder(string CommunityId, string orderId, string txnTime, string txnAmt, ref bool R, ref string BankOrderId) { string Result = ""; R = false; Dictionary <string, string> param = new Dictionary <string, string>(); //以下信息非特殊情况不需要改动 param["version"] = "5.0.0"; //版本号 param["encoding"] = "UTF-8"; //编码方式 param["txnType"] = "01"; //交易类型 param["txnSubType"] = "01"; //交易子类 param["bizType"] = "000201"; //业务类型 param["signMethod"] = "01"; //签名方法 param["channelType"] = "08"; //渠道类型 param["accessType"] = "0"; //接入类型 param["frontUrl"] = s.FrontUrl; //前台通知地址 param["backUrl"] = s.BackUrl; //后台通知地址 param["currencyCode"] = "156"; //交易币种 param["merId"] = s.merId.ToString(); //商户号 param["orderId"] = orderId; //商户订单号,8-32位数字字母,不能含“-”或“_” param["txnTime"] = txnTime; //订单发送时间,格式为YYYYMMDDhhmmss, param["txnAmt"] = txnAmt; //交易金额,单位分,此处默认取demo演示页面传递的参数 param["reqReserved"] = CommunityId.ToString(); //自定义信息 AcpService.Sign(param, System.Text.Encoding.UTF8, s); // 签名 string url = s.AppRequestUrl; 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) { //返回银行流水号 R = true; BankOrderId = rspData["tn"]; } else { //其他应答码做以失败处理 R = false; Result = "创建银行订单失败,订单号:" + orderId + ",时间:" + txnTime.ToString() + ",返回码:" + rspData["respMsg"].ToString(); } } else { R = false; Result = "商户端验证返回报文签名失败"; } } else { R = false; Result = "请求失败"; } return(Result); }
protected void Page_Load(object sender, EventArgs e) { /** * 重要:联调测试时请仔细阅读注释! * * 产品:跳转网关支付产品<br> * 交易:消费撤销类交易:后台消费撤销交易,有同步应答和后台通知应答<br> * 日期: 2015-09<br> * 版权: 中国银联<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)以后台通知或交易状态查询交易确定交易成功 * 2)消费撤销仅能对当清算日的消费做,必须为全额,一般当日或第二日到账。 */ Dictionary <string, string> param = new Dictionary <string, string>(); //以下信息非特殊情况不需要改动 param["version"] = "5.0.0"; //版本号 param["encoding"] = "UTF-8"; //编码方式 param["signMethod"] = "01"; //签名方法 param["txnType"] = "31"; //交易类型 param["txnSubType"] = "00"; //交易子类 param["bizType"] = "000201"; //业务类型 param["accessType"] = "0"; //接入类型 param["channelType"] = "07"; //渠道类型 param["backUrl"] = SDKConfig.BackUrl; //后台通知地址 //TODO 以下信息需要填写 param["orderId"] = Request.Form["orderId"].ToString(); //商户订单号,8-32位数字字母,不能含“-”或“_”,可以自行定制规则,重新产生,不同于原消费,此处默认取demo演示页面传递的参数 param["merId"] = Request.Form["merId"].ToString(); //商户代码,请改成自己的测试商户号,此处默认取demo演示页面传递的参数 param["origQryId"] = Request.Form["origQryId"].ToString(); //原消费的queryId,可以从查询接口或者通知接口中获取,此处默认取demo演示页面传递的参数 param["txnTime"] = Request.Form["txnTime"].ToString(); //订单发送时间,格式为YYYYMMDDhhmmss,重新产生,不同于原消费,此处默认取demo演示页面传递的参数,参考取法: DateTime.Now.ToString("yyyyMMddHHmmss") param["txnAmt"] = Request.Form["txnAmt"].ToString(); //交易金额,消费撤销时需和原消费一致,此处默认取demo演示页面传递的参数 //param["reqReserved"] = "透传信息";//请求方保留域,透传字段,查询、通知、对账文件中均会原样出现,如有需要请启用并修改自己希望透传的数据 AcpService.Sign(param, System.Text.Encoding.UTF8); // 签名 string url = SDKConfig.BackTransUrl; Dictionary <String, String> rspData = AcpService.Post(param, url, System.Text.Encoding.UTF8); // HttpClient hc = new HttpClient(url); // int status = hc.Send(param, System.Text.Encoding.UTF8); // string result = hc.Result; 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) { //交易已受理,等待接收后台通知更新订单状态,如果通知长时间未收到也可发起交易状态查询 //TODO Response.Write("受理成功。<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("商户端验证返回报文签名失败。<br>\n"); } } else { Response.Write("请求失败<br>\n"); } }
public Refund BuildRefund(Refund refund) { Dictionary <string, string> param = new Dictionary <string, string>(); //以下信息非特殊情况不需要改动 param["version"] = "5.0.0"; //版本号 param["encoding"] = "UTF-8"; //编码方式 param["signMethod"] = "01"; //签名方法 param["txnType"] = "04"; //交易类型 param["txnSubType"] = "00"; //交易子类 param["bizType"] = "000201"; //业务类型 param["accessType"] = "0"; //接入类型 param["channelType"] = "07"; //渠道类型 param["backUrl"] = ""; //后台通知地址 //TODO 以下信息需要填写 param["orderId"] = refund.OutRefundNo; //商户订单号,8-32位数字字母,不能含“-”或“_”,可以自行定制规则,重新产生,不同于原消费,此处默认取demo演示页面传递的参数 param["merId"] = Merchant.Partner; //商户代码,请改成自己的测试商户号,此处默认取demo演示页面传递的参数 param["origQryId"] = refund.TradeNo; //原消费的queryId,可以从查询接口或者通知接口中获取,此处默认取demo演示页面传递的参数 param["txnTime"] = refund.PaymentDate.ToString("yyyyMMddHHmmss"); //订单发送时间,格式为YYYYMMDDhhmmss,重新产生,不同于原消费,此处默认取demo演示页面传递的参数,参考取法: DateTime.Now.ToString("yyyyMMddHHmmss") param["txnAmt"] = (refund.RefundAmount * 100).ToString(); //交易金额,退货总金额需要小于等于原消费 // 请求方保留域, // 透传字段,查询、通知、对账文件中均会原样出现,如有需要请启用并修改自己希望透传的数据。 // 出现部分特殊字符时可能影响解析,请按下面建议的方式填写: // 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("任意格式的信息都可以")); AcpService.Sign(param, System.Text.Encoding.UTF8); // 签名 string url = SDKConfig.BackTransUrl; Dictionary <String, String> rspData = AcpService.Post(param, url, System.Text.Encoding.UTF8); // HttpClient hc = new HttpClient(url); // int status = hc.Send(param, System.Text.Encoding.UTF8); // string result = hc.Result; if (rspData.Count != 0) { if (AcpService.Validate(rspData, System.Text.Encoding.UTF8)) { string respcode = rspData["respCode"]; //其他应答参数也可用此方法获取 if ("00" == respcode) { //交易已受理,等待接收后台通知更新订单状态,如果通知长时间未收到也可发起交易状态查询 //TODO refund.TradeNo = rspData["origQryId"]; refund.RefundNo = rspData["queryId"]; refund.RefundStatus = true; } else if ("03" == respcode || "04" == respcode || "05" == respcode) { //后续需发起交易状态查询交易确定交易状态 //TODO } else { //其他应答码做以失败处理 //TODO } } else { //商户端验证返回报文签名失败 //TODO } } else { //请求失败 //TODO } return(refund); }
protected void Page_Load(object sender, EventArgs e) { /** * 重要:联调测试时请仔细阅读注释! * * 产品:无跳转产品<br> * 交易:查询开通状态:后台交易,同步交易<br> * 日期: 2015-11<br> * 版权: 中国银联<br> * 说明:以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己需要,按照技术文档编写。该代码仅供参考,不提供编码性能规范性等方面的保障<br> * 提示:该接口参考文档位置:open.unionpay.com帮助中心 下载 产品接口规范 《无跳转产品接口规范》,<br> * 《全渠道平台接入接口规范 第3部分 文件接口》(4.批量文件基本约定)<br> * 测试过程中的如果遇到疑问或问题您可以:1)优先在open平台中查找答案: * 调试过程中的问题或其他问题请在 https://open.unionpay.com/ajweb/help/faq/list 帮助中心 FAQ 搜索解决方案 * 测试过程中产生的7位应答码问题疑问请在https://open.unionpay.com/ajweb/help/respCode/respCodeList 输入应答码搜索解决方案 * 2) 咨询在线人工支持: open.unionpay.com注册一个用户并登陆在右上角点击“在线客服”,咨询人工QQ测试支持。 * 3) 测试环境测试支付请使用测试卡号测试, FAQ搜索“测试卡号” * 4) 切换生产环境要点请FAQ搜索“切换” * 交易说明:根据卡号查询卡是否已经开通,同步应答确定交易成功。 */ Dictionary <string, string> param = new Dictionary <string, string>(); // 以下信息需要填写 param["orderId"] = Request.Form["orderId"].ToString(); //商户订单号,8-32位数字字母,可按自己规则产生,此处默认取demo演示页面传递的参数 param["merId"] = Request.Form["merId"].ToString(); //商户代码,请改成自己的测试商户号,此处默认取demo演示页面传递的参数 param["txnTime"] = Request.Form["txnTime"].ToString(); //订单发送时间,取系统时间,此处默认取demo演示页面传递的参数 //支付卡信息填写 string accNo = "6226090000000048"; //卡号 //param["accNo"] = accNo; //卡号,旧规范请按此方式填写 param["accNo"] = AcpService.EncryptData(accNo, System.Text.Encoding.UTF8); //卡号,新规范请按此方式填写 //以下信息非特殊情况不需要改动 param["version"] = SDKConfig.Version; //版本号 param["encoding"] = "UTF-8"; //编码方式 param["signMethod"] = SDKConfig.SignMethod; //签名方法 param["txnType"] = "78"; //交易类型 param["txnSubType"] = "00"; //交易子类 param["bizType"] = "000301"; //业务类型 param["accessType"] = "0"; //接入类型 param["channelType"] = "07"; //渠道类型 param["encryptCertId"] = AcpService.GetEncryptCertId(); //加密证书ID AcpService.Sign(param, System.Text.Encoding.UTF8); // 签名 string url = SDKConfig.BackTransUrl; 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) { //成功 //TODO Response.Write("已开通。<br>\n"); if (rspData.ContainsKey("customerInfo")) { Dictionary <string, string> customerInfo = AcpService.ParseCustomerInfo(rspData["customerInfo"], System.Text.Encoding.UTF8); if (customerInfo.ContainsKey("phoneNo")) { string phoneNo = customerInfo["phoneNo"]; //customerInfo其他子域均可参考此方式获取 } foreach (KeyValuePair <string, string> pair in customerInfo) { Response.Write(pair.Key + "=" + pair.Value + "<br>\n"); } } } else if ("77" == respcode) { //未开通 //TODO Response.Write("未开通。<br>\n"); } else { //其他应答码做以失败处理 //TODO Response.Write("失败:" + rspData["respMsg"] + "。<br>\n"); } } else { Response.Write("商户端验证返回报文签名失败\n"); } } else { Response.Write("请求失败<br>\n"); } }
protected void Page_Load(object sender, EventArgs e) { /** * 产品:二维码支付<br> * 交易:二维码消费(被扫)<br> * 日期: 2017-02<br> * 版权: 中国银联<br> **/ Dictionary <string, string> param = new Dictionary <string, string>(); //以下信息非特殊情况不需要改动 param["version"] = SDKConfig.Version; //版本号 param["encoding"] = "UTF-8"; //编码方式 param["signMethod"] = SDKConfig.SignMethod; // "01";//签名方法 param["txnType"] = "01"; //交易类型 param["txnSubType"] = "06"; //交易子类 param["bizType"] = "000000"; //产品类型 param["channelType"] = "07"; //渠道类型 param["backUrl"] = SDKConfig.BackUrl; // "http://www.specialUrl.com"; param["accessType"] = "0"; //接入类型(0普通商户直接接入) param["accType"] = "01"; //账号类型(01银行卡) param["currencyCode"] = "156"; //交易币种 // param["reserved"] = "";//保留域 //TODO 以下信息需要填写 param["merId"] = Request.Form["merId"].ToString(); //商户号,请改自己的测试商户号,此处默认取demo演示页面传递的参数 param["orderId"] = Request.Form["orderId"].ToString(); //商户订单号,8-32位数字字母,不能含“-”或“_”,此处默认取demo演示页面传递的参数,可以自行定制规则 param["txnTime"] = Request.Form["txnTime"].ToString(); //订单发送时间,格式为YYYYMMDDhhmmss,取北京时间,此处默认取demo演示页面传递的参数,参考取法: DateTime.Now.ToString("yyyyMMddHHmmss") param["txnAmt"] = Request.Form["txnAmt"].ToString(); //交易金额,单位分,此处默认取demo演示页面传递的参数 param["qrNo"] = Request.Form["qrNo"].ToString(); //二维码 编号,此处默认取demo演示页面传递的参数 param["termId"] = Request.Form["termId"].ToString(); //终端号 //param["reqReserved"] = "透传信息";//请求方保留域,透传字段,查询、通知、对账文件中均会原样出现,如有需要请启用并修改自己希望透传的数据 //TODO 其他特殊用法请查看 pages/api_01_gateway/special_use_purchase.htm AcpService.Sign(param, System.Text.Encoding.UTF8); // 签名 string url = SDKConfig.BackTransUrl; //发送post 请求的地址 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) { //交易已受理,等待接收后台通知更新订单状态,如果通知长时间未收到也可发起交易状态查询 //TODO Response.Write("受理成功。<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("商户端验证返回报文签名失败。<br>\n"); } } else { Response.Write("请求失败<br>\n"); } }
protected void Page_Load(object sender, EventArgs e) { Dictionary <string, string> param = new Dictionary <string, string>(); //以下信息非特殊情况不需要改动 param["version"] = SDKConfig.Version; //版本号 param["encoding"] = "UTF-8"; //编码方式 param["txnType"] = "95"; //交易类型 param["txnSubType"] = "00"; //交易子类 param["bizType"] = "000000"; //业务类型 param["signMethod"] = SDKConfig.SignMethod; //签名方法 param["channelType"] = "08"; //渠道类型 param["certType"] = "01"; //01:敏感信息加密公钥(只有01可用) param["accessType"] = "0"; // //TODO 以下信息需要填写 param["merId"] = Request.Form["merId"].ToString(); //商户号,请改自己的测试商户号,此处默认取demo演示页面传递的参数 param["orderId"] = Request.Form["orderId"].ToString(); //商户订单号,8-32位数字字母,不能含“-”或“_”,此处默认取demo演示页面传递的参数,可以自行定制规则 param["txnTime"] = Request.Form["txnTime"].ToString(); //订单发送时间,格式为YYYYMMDDhhmmss,取北京时间,此处默认取demo演示页面传递的参数,参考取法: DateTime.Now.ToString("yyyyMMddHHmmss") //TODO 其他特殊用法请查看 pages/api_05_app/special_use_purchase.htm AcpService.Sign(param, System.Text.Encoding.UTF8); // 签名 string url = SDKConfig.AppRequestUrl; 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) { int resultCode = AcpService.UpdateEncryptCert(rspData, System.Text.Encoding.UTF8); if (resultCode == 1) { Response.Write("加密公钥更新成功"); } else if (resultCode == 0) { Response.Write("加密公钥无更新"); } else { Response.Write("加密公钥更新失败"); } } else { //其他应答码做以失败处理 //TODO Response.Write("失败:" + rspData["respMsg"] + "。<br>\n"); } } else { Response.Write("商户端验证返回报文签名失败。<br>\n"); } } else { Response.Write("请求失败<br>\n"); } }
protected void Page_Load(object sender, EventArgs e) { if (Session["userID"] == null || Session["loginID"] == null) { Response.Write("您还未登录"); return; } int userID = Convert.ToInt32(Session["userID"].ToString()); int loginID = Convert.ToInt32(Session["loginID"].ToString()); int orderId = WebCommon.GetIntPara(Context, "orderId");//订单ID tb_user u = new tb_userHandle().GetInfo(userID); tb_userLoginHandle loginHandle = new tb_userLoginHandle(); tb_userLogin uLogin = loginHandle.GetInfo(loginID); if (u == null) { Response.Write("找不到用户信息"); return; } else if (uLogin == null) { Response.Write("找不到登录信息"); return; } else if (!uLogin.isMainEquimment) { Response.Write("此设备不是用户的主设备,不能进行该操作"); return; } uLogin.endTime = DateTime.Now.AddDays(1); loginHandle.Upd(uLogin); if (orderId <= 0) { Response.Write("输入的订单ID不无效"); return; } tb_userOrder uo = new tb_userOrderHandle().GetInfo(orderId); if (uo == null) { Response.Write("订单信息不存在"); return; } else if (uo.userID != userID) { Response.Write("该订单不是您的"); return; } else if (uo.payStatus) { Response.Write("该订单已支付"); return; } else if (uo.currency != 1) { Response.Write("该订单不是使用人民币支付"); return; } string rand = new StaticMethod().RandStr(10, 3); string sign = func.GetSign(orderId, rand); /** * 重要:联调测试时请仔细阅读注释! * * 产品:跳转网关支付产品<br> * 交易:消费:前台跳转,有前台通知应答和后台通知应答<br> * 日期: 2015-09<br> * 版本: 1.0.0 * 版权: 中国银联<br> * 说明:以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己需要,按照技术文档编写。该代码仅供参考,不提供编码性能规范性等方面的保障<br> * 提示:该接口参考文档位置:open.unionpay.com帮助中心 下载 产品接口规范 《网关支付产品接口规范》,<br> * 《平台接入接口规范-第5部分-附录》(内包含应答码接口规范,全渠道平台银行名称-简码对照表)<br> * 《全渠道平台接入接口规范 第3部分 文件接口》(对账文件格式说明)<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)以后台通知或交易状态查询交易确定交易成功,前台通知不能作为判断成功的标准. * 2)交易状态查询交易(Form_6_5_Query)建议调用机制:前台类交易建议间隔(5分、10分、30分、60分、120分)发起交易查询,如果查询到结果成功,则不用再查询。(失败,处理中,查询不到订单均可能为中间状态)。也可以建议商户使用payTimeout(支付超时时间),过了这个时间点查询,得到的结果为最终结果。 */ Dictionary <string, string> param = new Dictionary <string, string>(); //以下信息非特殊情况不需要改动 param["version"] = "5.0.0"; //版本号 param["encoding"] = "UTF-8"; //编码方式 param["txnType"] = "01"; //交易类型 param["txnSubType"] = "01"; //交易子类 param["bizType"] = "000201"; //业务类型 param["signMethod"] = "01"; //签名方法 param["channelType"] = "08"; //渠道类型 param["accessType"] = "0"; //接入类型 param["frontUrl"] = SDKConfig.FrontUrl + "?sumPrice=" + uo.sumPrice.ToString(); //前台通知地址 param["backUrl"] = SDKConfig.BackUrl + "?orderId=" + orderId.ToString() + "&rand=" + rand + "&sign=" + sign; //后台通知地址 param["currencyCode"] = "156"; //交易币种 //TODO 以下信息需要填写 param["merId"] = Var.merId; //商户号,请改自己的测试商户号,此处默认取demo演示页面传递的参数 param["orderId"] = uo.orderCode; //商户订单号,8-32位数字字母,不能含“-”或“_”,此处默认取demo演示页面传递的参数,可以自行定制规则 param["txnTime"] = DateTime.Now.ToString("yyyyMMddHHmmss"); //订单发送时间,格式为YYYYMMDDhhmmss,取北京时间,此处默认取demo演示页面传递的参数,参考取法: DateTime.Now.ToString("yyyyMMddHHmmss") param["txnAmt"] = ((long)(100.0 * (double)uo.sumPrice)).ToString(); //交易金额,单位分,此处默认取demo演示页面传递的参数 //param["reqReserved"] = "透传信息";//请求方保留域,透传字段,查询、通知、对账文件中均会原样出现,如有需要请启用并修改自己希望透传的数据 //TODO 其他特殊用法请查看 pages/api_01_gateway/special_use_purchase.htm AcpService.Sign(param, System.Text.Encoding.UTF8); string html = AcpService.CreateAutoFormHtml(SDKConfig.FrontTransUrl, param, System.Text.Encoding.UTF8); // 将SDKUtil产生的Html文档写入页面,从而引导用户浏览器重定向 Response.ContentEncoding = Encoding.UTF8; // 指定输出编码 Response.Write(html); }
protected void Page_Load(object sender, EventArgs e) { /** * 重要:联调测试时请仔细阅读注释! * * 产品:无跳转产品<br> * 交易:消费:前台交易,有后台通知<br> * 日期: 2015-11<br> * 版本: 1.0.0 * 版权: 中国银联<br> * 说明:以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己需要,按照技术文档编写。该代码仅供参考,不提供编码性能规范性等方面的保障<br> * 交易说明:1)确定交易成功机制:商户需开发后台通知接口或交易状态查询接口(Form03_6_5_Query)确定交易是否成功,建议发起查询交易的机制:可查询N次(不超过6次),每次时间间隔2N秒发起,即间隔1,2,4,8,16,32S查询(查询到03,04,05继续查询,否则终止查询) * 2)报文中必送卡号,消费后卡号就开通了。 */ Dictionary <string, string> param = new Dictionary <string, string>(); //以下信息需要填写 param["orderId"] = Request.Form["orderId"].ToString(); //商户订单号,8-32位数字字母,可按自己规则产生,此处默认取demo演示页面传递的参数 param["merId"] = Request.Form["merId"].ToString(); //商户代码,请改成自己的测试商户号,此处默认取demo演示页面传递的参数 param["txnTime"] = Request.Form["txnTime"].ToString(); //订单发送时间,取系统时间,此处默认取demo演示页面传递的参数 param["txnAmt"] = Request.Form["txnAmt"].ToString(); //交易金额,单位分 ,此处默认取demo演示页面传递的参数 //param["reserved"] = "{customPage=true}";//如果开通并支付页面需要使用嵌入页面的话,请上送此用法 // 请求方保留域, // 透传字段,查询、通知、对账文件中均会原样出现,如有需要请启用并修改自己希望透传的数据。 // 出现部分特殊字符时可能影响解析,请按下面建议的方式填写: // 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("任意格式的信息都可以")); //支付卡信息填写 string accNo = "6226090000000048"; //卡号 Dictionary <string, string> customerInfo = new Dictionary <string, string>(); customerInfo["phoneNo"] = "18100000000"; //手机号 customerInfo["smsCode"] = "111111"; //短信验证码,测试环境不会真实收到短信,固定填111111 customerInfo["certifTp"] = "01"; //证件类型,01-身份证 customerInfo["certifId"] = "510265790128303"; //证件号,15位身份证不校验尾号,18位会校验尾号,请务必在前端写好校验代码 customerInfo["customerNm"] = "张三"; //姓名 //customerInfo["cvn2"] = "248"; //cvn2 //customerInfo["expired"] = "1912"; //有效期,YYMM格式,持卡人卡面印的是MMYY的,请注意代码设置倒一下 //param["accNo"] = accNo; //卡号,旧规范请按此方式填写 //param["customerInfo"] = AcpService.GetCustomerInfo(customerInfo, System.Text.Encoding.UTF8); //持卡人身份信息,旧规范请按此方式填写 param["accNo"] = AcpService.EncryptData(accNo, System.Text.Encoding.UTF8); //卡号,新规范请按此方式填写 param["customerInfo"] = AcpService.GetCustomerInfoWithEncrypt(customerInfo, System.Text.Encoding.UTF8); //持卡人身份信息,新规范请按此方式填写 // 订单超时时间。 // 超过此时间后,除网银交易外,其他交易银联系统会拒绝受理,提示超时。 跳转银行网银交易如果超时后交易成功,会自动退款,大约5个工作日金额返还到持卡人账户。 // 此时间建议取支付时的北京时间加15分钟。 // 超过超时时间调查询接口应答origRespCode不是A6或者00的就可以判断为失败。 param["payTimeout"] = DateTime.Now.AddMinutes(15).ToString("yyyyMMddHHmmss"); //以下信息非特殊情况不需要改动 param["version"] = SdkConfig.Version; //版本号 param["encoding"] = "UTF-8"; //编码方式 param["signMethod"] = SdkConfig.SignMethod; //签名方法 param["txnType"] = "01"; //交易类型 param["txnSubType"] = "01"; //交易子类 param["bizType"] = "000301"; //业务类型 param["accessType"] = "0"; //接入类型 param["channelType"] = "07"; //渠道类型 param["currencyCode"] = "156"; //交易币种,境内商户勿改 param["encryptCertId"] = AcpService.GetEncryptCertId(); //加密证书ID param["frontUrl"] = SdkConfig.FrontUrl; //前台通知地址 param["backUrl"] = SdkConfig.BackUrl; //后台通知地址 AcpService.Sign(param, System.Text.Encoding.UTF8); // 签名 string url = SdkConfig.FrontTransUrl; string html = AcpService.CreateAutoFormHtml(url, param, System.Text.Encoding.UTF8); Response.ContentEncoding = Encoding.UTF8; // 指定输出编码 Response.Write(html); }
protected void Page_Load(object sender, EventArgs e) { /** * 重要:联调测试时请仔细阅读注释! * * 产品:跳转网关支付产品<br> * 交易:预授权:前台跳转,有前台通知应答和后台通知应答<br> * 日期: 2015-09<br> * 版本: 1.0.0 * 版权: 中国银联<br> * 说明:以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己需要,按照技术文档编写。该代码仅供参考,不提供编码性能规范性等方面的保障<br> * 提示:该接口参考文档位置:open.unionpay.com帮助中心 下载 产品接口规范 《网关支付产品接口规范》,<br> * 《平台接入接口规范-第5部分-附录》(内包含应答码接口规范,全渠道平台银行名称-简码对照表)<br> * 《全渠道平台接入接口规范 第3部分 文件接口》(对账文件格式说明)<br> * 测试过程中的如果遇到疑问或问题您可以:1)优先在open平台中查找答案: * 调试过程中的问题或其他问题请在 https://open.unionpay.com/ajweb/help/faq/list 帮助中心 FAQ 搜索解决方案 * 测试过程中产生的7位应答码问题疑问请在https://open.unionpay.com/ajweb/help/respCode/respCodeList 输入应答码搜索解决方案 * 2) 咨询在线人工支持: open.unionpay.com注册一个用户并登陆在右上角点击“在线客服”,咨询人工QQ测试支持。 * 交易说明:1)以后台通知或交易状态查询交易确定交易成功,前台通知不能作为判断成功的标准. * 2)交易状态查询交易(Form_6_5_Query)建议调用机制:前台类交易间隔(5分、10分、30分、60分、120分)发起交易查询,如果查询到结果成功,则不用再查询。(失败,处理中,查询不到订单均可能为中间状态)。也可以建议商户使用payTimeout(支付超时时间),过了这个时间点查询,得到的结果为最终结果。 */ Dictionary <string, string> param = new Dictionary <string, string>(); //以下信息非特殊情况不需要改动 param["version"] = SDKConfig.Version; //版本号 param["encoding"] = "UTF-8"; //编码方式 param["txnType"] = "02"; //交易类型 param["txnSubType"] = "01"; //交易子类 param["bizType"] = "000201"; //业务类型 param["signMethod"] = SDKConfig.SignMethod; //签名方法 param["channelType"] = "08"; //渠道类型 param["accessType"] = "0"; //接入类型 param["frontUrl"] = SDKConfig.FrontUrl; //前台通知地址 param["backUrl"] = SDKConfig.BackUrl; //后台通知地址 param["currencyCode"] = "156"; //交易币种 //TODO 以下信息需要填写 param["merId"] = Request.Form["merId"].ToString(); //商户号,请改自己的测试商户号,此处默认取demo演示页面传递的参数 param["orderId"] = Request.Form["orderId"].ToString(); //商户订单号,8-32位数字字母,不能含“-”或“_”,此处默认取demo演示页面传递的参数,可以自行定制规则 param["txnTime"] = Request.Form["txnTime"].ToString(); //订单发送时间,格式为YYYYMMDDhhmmss,取北京时间,此处默认取demo演示页面传递的参数,参考取法: DateTime.Now.ToString("yyyyMMddHHmmss") param["txnAmt"] = Request.Form["txnAmt"].ToString(); //交易金额,单位分,此处默认取demo演示页面传递的参数 // 请求方保留域, // 透传字段,查询、通知、对账文件中均会原样出现,如有需要请启用并修改自己希望透传的数据。 // 出现部分特殊字符时可能影响解析,请按下面建议的方式填写: // 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("任意格式的信息都可以")); //TODO 其他特殊用法请查看 pages/api_05_app/special_use_preauth.htm AcpService.Sign(param, System.Text.Encoding.UTF8); // 签名 string url = SDKConfig.AppRequestUrl; Dictionary <String, String> rspData = AcpService.Post(param, url, System.Text.Encoding.UTF8); // HttpClient hc = new HttpClient(url); // int status = hc.Send(param, System.Text.Encoding.UTF8); // string result = hc.Result; 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) { //成功 //TODO Response.Write("成功接收tn:" + rspData["tn"] + "<br>\n"); Response.Write("后续请将此tn传给手机开发,由他们用此tn调起控件后完成支付。<br>\n"); Response.Write("手机端demo默认从仿真获取tn,仿真只返回一个tn,如不想修改手机和后台间的通讯方式,【此页面请修改代码为只输出tn】。<br>\n"); } else { //其他应答码做以失败处理 //TODO Response.Write("失败:" + rspData["respMsg"] + "。<br>\n"); } } else { Response.Write("商户端验证返回报文签名失败。<br>\n"); } } else { Response.Write("请求失败<br>\n"); } }
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"); } }
protected void Page_Load(object sender, EventArgs e) { /** * 重要:联调测试时请仔细阅读注释! * * 产品:无跳转token产品<br> * 交易:更新token号:后台交易,无通知<br> * 日期: 2015-09<br> * 版本: 1.0.0 * 版权: 中国银联<br> * 说明:以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己需要,按照技术文档编写。该代码仅供参考,不提供编码性能规范性等方面的保障<br> * 交易说明: 同步应答确定交易成功。仅支持商户侧开通的方式。推荐直接使用开通接口来更新token,而非用这个接口更新。 * */ Dictionary <string, string> param = new Dictionary <string, string>(); // 以下信息需要填写 param["orderId"] = Request.Form["orderId"].ToString(); //商户订单号,8-32位数字字母,可按自己规则产生,如上送短信验证码,请填写获取验证码时一样的orderId,此处默认取demo演示页面传递的参数 param["merId"] = Request.Form["merId"].ToString(); //商户代码,请改成自己的测试商户号,此处默认取demo演示页面传递的参数 param["txnTime"] = Request.Form["txnTime"].ToString(); //订单发送时间,取系统时间,如上送短信验证码,请填写获取验证码时一样的orderId,此处默认取demo演示页面传递的参数 param["tokenPayData"] = "{trId=62000000001&token=" + Request.Form["token"].ToString() + "&tokenType=01}"; //token号从开通和开通查询借口获取,trId和开通接口时上送的相同 //支付卡信息填写 //贷记卡 必送:手机号、CVN2、有效期;验证码看业务配置(默认需要短信验证码)。 //借记卡 必送:手机号;选送:证件类型+证件号、姓名;验证码看业务配置(默认需要短信验证码)。 Dictionary <string, string> customerInfo = new Dictionary <string, string>(); customerInfo["phoneNo"] = "18100000000"; //手机号 //customerInfo["certifTp"] = "01"; //证件类型,01-身份证 //customerInfo["certifId"] = "510265790128303"; //证件号,15位身份证不校验尾号,18位会校验尾号,请务必在前端写好校验代码 //customerInfo["customerNm"] = "张三"; //姓名 customerInfo["cvn2"] = "248"; //cvn2 customerInfo["expired"] = "1912"; //有效期,YYMM格式,持卡人卡面印的是MMYY的,请注意代码设置倒一下 customerInfo["smsCode"] = "111111"; //短信验证码,测试环境不会真实收到短信,固定填111111。除了123456和654321固定反失败,其余固定成功。此接口获取验证码接口同开通的获取验证码接口。 //param["customerInfo"] = AcpService.GetCustomerInfo(customerInfo, System.Text.Encoding.UTF8); //持卡人身份信息,旧规范请按此方式填写 param["customerInfo"] = AcpService.GetCustomerInfoWithEncrypt(customerInfo, System.Text.Encoding.UTF8); //持卡人身份信息,新规范请按此方式填写 //以下信息非特殊情况不需要改动 param["version"] = SDKConfig.Version; //版本号 param["encoding"] = "UTF-8"; //编码方式 param["signMethod"] = SDKConfig.SignMethod; //签名方法 param["txnType"] = "79"; //交易类型 param["txnSubType"] = "03"; //交易子类 param["bizType"] = "000902"; //业务类型 param["accessType"] = "0"; //接入类型 param["channelType"] = "07"; //渠道类型 param["encryptCertId"] = AcpService.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) { //更新标记成功 //TODO Response.Write("更新标记成功。<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"); } }
protected void Page_Load(object sender, EventArgs e) { decimal PayCash = decimal.Parse(Request["PayCash"]); string out_trade_no = DateTime.Now.ToString("yyyyMMddHHmmss") + new Random().Next(100000, 999999); if (PayCash <= 0) { Response.Write("充值金额需大于0"); Response.End(); } /** * 重要:联调测试时请仔细阅读注释! * * 产品:跳转网关支付产品<br> * 交易:预授权:前台跳转,有前台通知应答和后台通知应答<br> * 日期: 2015-09<br> * 版本: 1.0.0 * 版权: 中国银联<br> * 说明:以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己需要,按照技术文档编写。该代码仅供参考,不提供编码性能规范性等方面的保障<br> * 提示:该接口参考文档位置:open.unionpay.com帮助中心 下载 产品接口规范 《网关支付产品接口规范》,<br> * 《平台接入接口规范-第5部分-附录》(内包含应答码接口规范,全渠道平台银行名称-简码对照表)<br> * 《全渠道平台接入接口规范 第3部分 文件接口》(对账文件格式说明)<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)以后台通知或交易状态查询交易确定交易成功,前台通知不能作为判断成功的标准. * 2)交易状态查询交易(Form_6_5_Query)建议调用机制:前台类交易间隔(5分、10分、30分、60分、120分)发起交易查询,如果查询到结果成功,则不用再查询。(失败,处理中,查询不到订单均可能为中间状态)。也可以建议商户使用payTimeout(支付超时时间),过了这个时间点查询,得到的结果为最终结果。 */ Dictionary <string, string> param = new Dictionary <string, string>(); //以下信息非特殊情况不需要改动 param["version"] = "5.0.0"; //版本号 param["encoding"] = "UTF-8"; //编码方式 param["txnType"] = "01"; //交易类型 param["txnSubType"] = "01"; //交易子类 param["bizType"] = "000201"; //业务类型 param["signMethod"] = "01"; //签名方法 param["channelType"] = "08"; //渠道类型 param["accessType"] = "0"; //接入类型 param["frontUrl"] = SDKConfig.FrontUrl; //前台通知地址 param["backUrl"] = SDKConfig.BackUrl; //后台通知地址 param["currencyCode"] = "156"; //交易币种 //TODO 以下信息需要填写 param["merId"] = "***************"; //商户号,请改自己的测试商户号,此处默认取demo演示页面传递的参数 param["orderId"] = out_trade_no; //商户订单号,8-32位数字字母,不能含“-”或“_”,此处默认取demo演示页面传递的参数,可以自行定制规则 param["txnTime"] = DateTime.Now.ToString("yyyyMMddhhmmss"); //订单发送时间,格式为YYYYMMDDhhmmss,取北京时间,此处默认取demo演示页面传递的参数,参考取法: DateTime.Now.ToString("yyyyMMddHHmmss") param["txnAmt"] = (PayCash * 100).ToString(); //交易金额,单位分,此处默认取demo演示页面传递的参数 //param["reqReserved"] = "透传信息";//请求方保留域,透传字段,查询、通知、对账文件中均会原样出现,如有需要请启用并修改自己希望透传的数据 //充值记录 OrderBLL mbll = new OrderBLL(); mbll.Add(。。。。。。 "充值[银联]"); //TODO 其他特殊用法请查看 pages/api_01_gateway/special_use_preauth.htm AcpService.Sign(param, System.Text.Encoding.UTF8); string html = AcpService.CreateAutoFormHtml(SDKConfig.FrontTransUrl, param, System.Text.Encoding.UTF8); // 将SDKUtil产生的Html文档写入页面,从而引导用户浏览器重定向 Response.ContentEncoding = Encoding.UTF8; // 指定输出编码 Response.Write(html); }
protected void Page_Load(object sender, EventArgs e) { /** * 重要:联调测试时请仔细阅读注释! * * 产品:跳转网关支付产品<br> * 交易:消费:前台跳转,有前台通知应答和后台通知应答<br> * 日期: 2015-09<br> * 版本: 1.0.0 * 版权: 中国银联<br> * 说明:以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己需要,按照技术文档编写。该代码仅供参考,不提供编码性能规范性等方面的保障<br> * 提示:该接口参考文档位置:open.unionpay.com帮助中心 下载 产品接口规范 《网关支付产品接口规范》,<br> * 《平台接入接口规范-第5部分-附录》(内包含应答码接口规范,全渠道平台银行名称-简码对照表)<br> * 《全渠道平台接入接口规范 第3部分 文件接口》(对账文件格式说明)<br> * 测试过程中的如果遇到疑问或问题您可以:1)优先在open平台中查找答案: * 调试过程中的问题或其他问题请在 https://open.unionpay.com/ajweb/help/faq/list 帮助中心 FAQ 搜索解决方案 * 测试过程中产生的7位应答码问题疑问请在https://open.unionpay.com/ajweb/help/respCode/respCodeList 输入应答码搜索解决方案 * 2) 咨询在线人工支持: open.unionpay.com注册一个用户并登陆在右上角点击“在线客服”,咨询人工QQ测试支持。 * 交易说明:1)以后台通知或交易状态查询交易确定交易成功,前台通知不能作为判断成功的标准. * 2)交易状态查询交易(Form_6_5_Query)建议调用机制:前台类交易建议间隔(5分、10分、30分、60分、120分)发起交易查询,如果查询到结果成功,则不用再查询。(失败,处理中,查询不到订单均可能为中间状态)。也可以建议商户使用payTimeout(支付超时时间),过了这个时间点查询,得到的结果为最终结果。 */ Dictionary <string, string> param = new Dictionary <string, string>(); //以下信息非特殊情况不需要改动 param["version"] = SdkConfig.Version; //版本号 param["encoding"] = "UTF-8"; //编码方式 param["txnType"] = "95"; //交易类型 param["txnSubType"] = "00"; //交易子类 param["bizType"] = "000000"; //业务类型 param["signMethod"] = SdkConfig.SignMethod; //签名方法 param["channelType"] = "08"; //渠道类型 param["certType"] = "01"; //01:敏感信息加密公钥(只有01可用) param["accessType"] = "0"; // //TODO 以下信息需要填写 param["merId"] = Request.Form["merId"].ToString(); //商户号,请改自己的测试商户号,此处默认取demo演示页面传递的参数 param["orderId"] = Request.Form["orderId"].ToString(); //商户订单号,8-32位数字字母,不能含“-”或“_”,此处默认取demo演示页面传递的参数,可以自行定制规则 param["txnTime"] = Request.Form["txnTime"].ToString(); //订单发送时间,格式为YYYYMMDDhhmmss,取北京时间,此处默认取demo演示页面传递的参数,参考取法: DateTime.Now.ToString("yyyyMMddHHmmss") //TODO 其他特殊用法请查看 Pages/Template/special_use_purchase.htm AcpService.Sign(param, System.Text.Encoding.UTF8); // 签名 string url = SdkConfig.AppRequestUrl; 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) { int resultCode = AcpService.UpdateEncryptCert(rspData, System.Text.Encoding.UTF8); if (resultCode == 1) { Response.Write("加密公钥更新成功"); } else if (resultCode == 0) { Response.Write("加密公钥无更新"); } else { Response.Write("加密公钥更新失败"); } } else { //其他应答码做以失败处理 //TODO Response.Write("失败:" + rspData["respMsg"] + "。<br>\n"); } } else { Response.Write("商户端验证返回报文签名失败。<br>\n"); } } else { Response.Write("请求失败<br>\n"); } }
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 搜索解决方案 * 测试过程中产生的7位应答码问题疑问请在 https://open.unionpay.com/ajweb/help/respCode/respCodeList 输入应答码搜索解决方案 * 2) 咨询在线人工支持: open.unionpay.com注册一个用户并登陆在右上角点击“在线客服”,咨询人工QQ测试支持。 * 交易说明: 1)以后台通知或交易状态查询交易(Form_6_5_Query)确定交易成功,建议发起查询交易的机制:可查询N次(不超过6次),每次时间间隔2N秒发起,即间隔1,2,4,8,16,32S查询(查询到03,04,05继续查询,否则终止查询) * 2)退货金额不超过总金额,可以进行多次退货 * 3)退货能对11个月内的消费做(包括当清算日),支持部分退货或全额退货,到账时间较长,一般1-10个清算日(多数发卡行5天内,但工行可能会10天),所有银行都支持 */ Dictionary <string, string> param = new Dictionary <string, string>(); //以下信息非特殊情况不需要改动 param["version"] = SDKConfig.Version; //版本号 param["encoding"] = "UTF-8"; //编码方式 param["signMethod"] = SDKConfig.SignMethod; //签名方法 param["txnType"] = "04"; //交易类型 param["txnSubType"] = "00"; //交易子类 param["bizType"] = "000201"; //业务类型 param["accessType"] = "0"; //接入类型 param["channelType"] = "07"; //渠道类型 param["backUrl"] = SDKConfig.BackUrl; //后台通知地址 //TODO 以下信息需要填写 param["orderId"] = Request.Form["orderId"].ToString(); //商户订单号,8-32位数字字母,不能含“-”或“_”,可以自行定制规则,重新产生,不同于原消费,此处默认取demo演示页面传递的参数 param["merId"] = Request.Form["merId"].ToString(); //商户代码,请改成自己的测试商户号,此处默认取demo演示页面传递的参数 param["origQryId"] = Request.Form["origQryId"].ToString(); //原消费的queryId,可以从查询接口或者通知接口中获取,此处默认取demo演示页面传递的参数 param["txnTime"] = Request.Form["txnTime"].ToString(); //订单发送时间,格式为YYYYMMDDhhmmss,重新产生,不同于原消费,此处默认取demo演示页面传递的参数,参考取法: DateTime.Now.ToString("yyyyMMddHHmmss") param["txnAmt"] = Request.Form["txnAmt"].ToString(); //交易金额,退货总金额需要小于等于原消费 // 请求方保留域, // 透传字段,查询、通知、对账文件中均会原样出现,如有需要请启用并修改自己希望透传的数据。 // 出现部分特殊字符时可能影响解析,请按下面建议的方式填写: // 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("任意格式的信息都可以")); AcpService.Sign(param, System.Text.Encoding.UTF8); // 签名 string url = SDKConfig.BackTransUrl; Dictionary <String, String> rspData = AcpService.Post(param, url, System.Text.Encoding.UTF8); // HttpClient hc = new HttpClient(url); // int status = hc.Send(param, System.Text.Encoding.UTF8); // string result = hc.Result; 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) { //交易已受理,等待接收后台通知更新订单状态,如果通知长时间未收到也可发起交易状态查询 //TODO Response.Write("受理成功。<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("商户端验证返回报文签名失败。<br>\n"); } } else { Response.Write("请求失败<br>\n"); } }
protected void Page_Load(object sender, EventArgs e) { /** * 重要:联调测试时请仔细阅读注释! * * 产品:无跳转产品<br> * 交易:消费:后台资金类交易,有同步应答和后台通知应答<br> * 日期: 2015-09<br> * 版本: 1.0.0 * 版权: 中国银联<br> * 说明:以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己需要,按照技术文档编写。该代码仅供参考,不提供编码性能规范性等方面的保障<br> * 交易说明:1)确定交易成功机制:商户需开发后台通知接口或交易状态查询接口(Form03_6_5_Query)确定交易是否成功,建议发起查询交易的机制:可查询N次(不超过6次),每次时间间隔2N秒发起,即间隔1,2,4,8,16,32S查询(查询到03,04,05继续查询,否则终止查询) * 2)交易要素卡号+短信验证码(默认验证短信,如果配置了不验证短信则不送短信验证码) */ Dictionary <string, string> param = new Dictionary <string, string>(); //以下信息需要填写 param["orderId"] = Request.Form["orderId"].ToString(); //商户订单号,8-32位数字字母,可按自己规则产生,如上送短信验证码,请填写获取验证码时一样的orderId,此处默认取demo演示页面传递的参数 param["merId"] = Request.Form["merId"].ToString(); //商户代码,请改成自己的测试商户号,此处默认取demo演示页面传递的参数 param["txnTime"] = Request.Form["txnTime"].ToString(); //订单发送时间,取系统时间,如上送短信验证码,请填写获取验证码时一样的txnTime,此处默认取demo演示页面传递的参数 param["txnAmt"] = Request.Form["txnAmt"].ToString(); //交易金额,单位分,如上送短信验证码,请填写获取验证码时一样的txnAmt,此处默认取demo演示页面传递的参数 // 请求方保留域, // 透传字段,查询、通知、对账文件中均会原样出现,如有需要请启用并修改自己希望透传的数据。 // 出现部分特殊字符时可能影响解析,请按下面建议的方式填写: // 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("任意格式的信息都可以")); //支付卡信息填写 string accNo = "6226090000000048"; //卡号 Dictionary <string, string> customerInfo = new Dictionary <string, string>(); customerInfo["phoneNo"] = "18100000000"; //手机号 customerInfo["smsCode"] = "111111"; //短信验证码,测试环境不会真实收到短信,固定填111111 //param["accNo"] = accNo; //卡号,旧规范请按此方式填写 //param["customerInfo"] = AcpService.GetCustomerInfo(customerInfo, System.Text.Encoding.UTF8); //持卡人身份信息,旧规范请按此方式填写 param["accNo"] = AcpService.EncryptData(accNo, System.Text.Encoding.UTF8); //卡号,新规范请按此方式填写 param["customerInfo"] = AcpService.GetCustomerInfoWithEncrypt(customerInfo, System.Text.Encoding.UTF8); //持卡人身份信息,新规范请按此方式填写 //以下信息非特殊情况不需要改动 param["version"] = SdkConfig.Version; //版本号 param["encoding"] = "UTF-8"; //编码方式 param["signMethod"] = SdkConfig.SignMethod; //签名方法 param["txnType"] = "01"; //交易类型 param["txnSubType"] = "01"; //交易子类 param["bizType"] = "000301"; //业务类型 param["accessType"] = "0"; //接入类型 param["channelType"] = "07"; //渠道类型 param["currencyCode"] = "156"; //交易币种,境内商户勿改 param["encryptCertId"] = AcpService.GetEncryptCertId(); //加密证书ID param["backUrl"] = SdkConfig.BackUrl; //后台通知地址 AcpService.Sign(param, System.Text.Encoding.UTF8); // 签名 string url = SdkConfig.BackTransUrl; 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) { //交易已受理,等待接收后台通知更新订单状态,如果通知长时间未收到也可发起交易状态查询 //TODO Response.Write("受理成功。<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("商户端验证返回报文签名失败。<br>\n"); } } else { Response.Write("请求失败<br>\n"); } }
public bool QueryNow() { Dictionary <string, string> param = new Dictionary <string, string>(); //以下信息非特殊情况不需要改动 param["version"] = "5.0.0"; //版本号 param["encoding"] = "UTF-8"; //编码方式 param["signMethod"] = "01"; //签名方法 param["txnType"] = "00"; //交易类型 param["txnSubType"] = "00"; //交易子类 param["bizType"] = "000000"; //业务类型 param["accessType"] = "0"; //接入类型 param["channelType"] = "07"; //渠道类型 //TODO 以下信息需要填写 param["orderId"] = Order.OrderNo; //请修改被查询的交易的订单号,8-32位数字字母,不能含“-”或“_”,此处默认取demo演示页面传递的参数 param["merId"] = Merchant.Partner; //商户代码,请改成自己的测试商户号,此处默认取demo演示页面传递的参数 param["txnTime"] = Order.PaymentDate.ToString("yyyyMMddHHmmss");; //请修改被查询的交易的订单发送时间,格式为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); if (rspData.Count != 0) { if (AcpService.Validate(rspData, System.Text.Encoding.UTF8)) { string respcode = rspData["respCode"]; //其他应答参数也可用此方法获取 if ("00" == respcode) { string origRespCode = rspData["origRespCode"]; //其他应答参数也可用此方法获取 //处理被查询交易的应答码逻辑 if ("00" == origRespCode) { //交易成功,更新商户订单状态 //TODO //Response.Write("交易成功。<br>\n"); return(true); } else if ("03" == origRespCode || "04" == origRespCode || "05" == origRespCode) { //需再次发起交易状态查询交易 //TODO //Response.Write("稍后查询。<br>\n"); return(false); } else { //其他应答码做以失败处理 //TODO // Response.Write("交易失败:" + rspData["origRespMsg"] + "。<br>\n"); return(false); } } else if ("03" == respcode || "04" == respcode || "05" == respcode) { //不明原因超时,后续继续发起交易查询。 //TODO //Response.Write("处理超时,请稍后查询。<br>\n"); return(false); } else { //其他应答码做以失败处理 //TODO //Response.Write("查询操作失败:" + rspData["respMsg"] + "。<br>\n"); return(false); } } } else { //Response.Write("请求失败\n"); return(false); } return(false); }
protected void Page_Load(object sender, EventArgs e) { /** * 重要:联调测试时请仔细阅读注释! * 产品:二维码支付<br> * 交易:退货交易:后台资金类交易,有同步应答和后台通知应答<br> * 日期: 2017-02<br> * 版本: 1.0.0 * 版权: 中国银联<br> */ Dictionary <string, string> param = new Dictionary <string, string>(); //以下信息非特殊情况不需要改动 param["version"] = SDKConfig.Version; //版本号 param["encoding"] = "UTF-8"; //编码方式 param["signMethod"] = SDKConfig.SignMethod; // "01";//签名方法 param["txnType"] = "04"; //交易类型 param["txnSubType"] = "00"; //交易子类 param["bizType"] = "000000"; //产品类型 param["channelType"] = "07"; //渠道类型 param["backUrl"] = SDKConfig.BackUrl; // "http://www.specialUrl.com";//后台返回商户结果时使用,根据实际修改‘ param["accessType"] = "0"; //接入类型(0普通商户直接接入) //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演示页面传递的参数,参考取法: DateTime.Now.ToString("yyyyMMddHHmmss") param["txnAmt"] = Request.Form["txnAmt"].ToString(); //交易金额,退货总金额需要小于等于原消费 string origQryId = Request.Form["origQryId"].ToString(); string origOrderId = Request.Form["origOrderId"].ToString(); string origTxnTime = Request.Form["origTxnTime"].ToString(); if (origQryId != "") { param["origQryId"] = origQryId; //原消费的queryId,可以从查询接口或者通知接口中获取,此处默认取demo演示页面传递的参数 } if (origOrderId != "") { param["origOrderId"] = origOrderId; } if (origTxnTime != "") { param["origTxnTime"] = origTxnTime; } AcpService.Sign(param, System.Text.Encoding.UTF8); // 签名 string url = SDKConfig.BackTransUrl; //发送post 请求的地址 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) { //交易已受理,等待接收后台通知更新订单状态,如果通知长时间未收到也可发起交易状态查询 //TODO Response.Write("受理成功。<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("商户端验证返回报文签名失败。<br>\n"); } } else { Response.Write("请求失败<br>\n"); } }
protected void Page_Load(object sender, EventArgs e) { /** * 重要:联调测试时请仔细阅读注释! * * 产品:无跳转token产品<br> * 交易:删除token号:后台交易,无通知<br> * 日期: 2015-09<br> * 版本: 1.0.0 * 版权: 中国银联<br> * 说明:以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己需要,按照技术文档编写。该代码仅供参考,不提供编码性能规范性等方面的保障<br> * 交易说明: 同步应答确定交易成功。 * 删除token后重新申请token号会发生变化。 */ Dictionary <string, string> param = new Dictionary <string, string>(); // 以下信息需要填写 param["orderId"] = Request.Form["orderId"].ToString(); //商户订单号,8-32位数字字母,可按自己规则产生,此处默认取demo演示页面传递的参数 param["merId"] = Request.Form["merId"].ToString(); //商户代码,请改成自己的测试商户号,此处默认取demo演示页面传递的参数 param["txnTime"] = Request.Form["txnTime"].ToString(); //订单发送时间,取系统时间,此处默认取demo演示页面传递的参数 param["tokenPayData"] = "{trId=62000000001&token=" + Request.Form["token"].ToString() + "}"; //token号从开通和开通查询借口获取,trId和开通接口时上送的相同 //以下信息非特殊情况不需要改动 param["version"] = SDKConfig.Version; //版本号 param["encoding"] = "UTF-8"; //编码方式 param["signMethod"] = SDKConfig.SignMethod; //签名方法 param["txnType"] = "74"; //交易类型 param["txnSubType"] = "01"; //交易子类 param["bizType"] = "000902"; //业务类型 param["accessType"] = "0"; //接入类型 param["channelType"] = "07"; //渠道类型 param["encryptCertId"] = AcpService.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) { //成功 //TODO Response.Write("成功。<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); }
protected void Page_Load(object sender, EventArgs e) { /** * 重要:联调测试时请仔细阅读注释! * * 产品:无跳转产品<br> * 交易:消费短信:后台交易,无通知<br> * 日期: 2015-11<br> * 版本: 1.0.0 * 版权: 中国银联<br> * 说明:以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己需要,按照技术文档编写。该代码仅供参考,不提供编码性能规范性等方面的保障<br> * 交易说明: 金额 + 卡号 + 手机号phoneNo(customerInfo域),同步应答确定交易成功。 */ Dictionary <string, string> param = new Dictionary <string, string>(); //以下信息需要填写 param["orderId"] = Request.Form["orderId"].ToString(); //商户订单号,8-32位数字字母,可按自己规则产生,此处默认取demo演示页面传递的参数 param["merId"] = Request.Form["merId"].ToString(); //商户代码,请改成自己的测试商户号,此处默认取demo演示页面传递的参数 param["txnTime"] = Request.Form["txnTime"].ToString(); //订单发送时间,取系统时间,此处默认取demo演示页面传递的参数 param["txnAmt"] = Request.Form["txnAmt"].ToString(); //交易金额,单位分,此处默认取demo演示页面传递的参数 //支付卡信息填写 string accNo = "6226090000000048"; //卡号 Dictionary <string, string> customerInfo = new Dictionary <string, string>(); customerInfo["phoneNo"] = "18100000000"; //手机号 //param["accNo"] = accNo; //卡号,旧规范请按此方式填写 //param["customerInfo"] = AcpService.GetCustomerInfo(customerInfo, System.Text.Encoding.UTF8); //持卡人身份信息,旧规范请按此方式填写 param["accNo"] = AcpService.EncryptData(accNo, System.Text.Encoding.UTF8); //卡号,新规范请按此方式填写 param["customerInfo"] = AcpService.GetCustomerInfoWithEncrypt(customerInfo, System.Text.Encoding.UTF8); //持卡人身份信息,新规范请按此方式填写 //以下信息非特殊情况不需要改动 param["version"] = SDKConfig.Version; //版本号 param["encoding"] = "UTF-8"; //编码方式 param["signMethod"] = SDKConfig.SignMethod; //签名方法 param["txnType"] = "77"; //交易类型 param["txnSubType"] = "02"; //交易子类 param["bizType"] = "000301"; //业务类型 param["accessType"] = "0"; //接入类型 param["channelType"] = "07"; //渠道类型 param["currencyCode"] = "156"; //交易币种,境内商户勿改 param["encryptCertId"] = CertUtil.GetEncryptCertId(); //加密证书ID AcpService.Sign(param, System.Text.Encoding.UTF8); // 签名 string url = SDKConfig.BackTransUrl; 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) { //TODO Response.Write("消费短信交易成功。<br>\n"); } else { //其他应答码做以失败处理 //TODO Response.Write("失败:" + rspData["respMsg"] + "。<br>\n"); } } else { Response.Write("商户端验证返回报文签名失败。<br>\n"); } } else { Response.Write("请求失败<br>\n"); } }
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 搜索解决方案 * 测试过程中产生的7位应答码问题疑问请在https://open.unionpay.com/ajweb/help/respCode/respCodeList 输入应答码搜索解决方案 * 2) 咨询在线人工支持: open.unionpay.com注册一个用户并登陆在右上角点击“在线客服”,咨询人工QQ测试支持。 * 交易说明:代收同步返回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"] = SdkConfig.Version; //版本号 param["encoding"] = "UTF-8"; //编码方式 param["signMethod"] = SdkConfig.SignMethod; //签名方法 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"); } }
protected void Page_Load(object sender, EventArgs e) { /** * 重要:联调测试时请仔细阅读注释! * * 产品:无跳转产品<br> * 交易:银联侧开通:前台交易,有前台通知后台通知<br> * 日期: 2015-11<br> * 版本: 1.0.0 * 版权: 中国银联<br> * 说明:以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己需要,按照技术文档编写。该代码仅供参考,不提供编码性能规范性等方面的保障<br> * 该接口参考文档位置:open.unionpay.com帮助中心 下载 产品接口规范 《代收产品接口规范》<br> * 《平台接入接口规范-第5部分-附录》(内包含应答码接口规范)<br> * 测试过程中的如果遇到疑问或问题您可以:1)优先在open平台中查找答案: * 调试过程中的问题或其他问题请在 https://open.unionpay.com/ajweb/help/faq/list 帮助中心 FAQ 搜索解决方案 * 测试过程中产生的7位应答码问题疑问请在https://open.unionpay.com/ajweb/help/respCode/respCodeList 输入应答码搜索解决方案 * 2) 咨询在线人工支持: open.unionpay.com注册一个用户并登陆在右上角点击“在线客服”,咨询人工QQ测试支持。 * 交易说明:后台通知或者发起开通查询交易确认卡是否已经开通。 */ Dictionary <string, string> param = new Dictionary <string, string>(); // 以下信息需要填写 param["orderId"] = Request.Form["orderId"].ToString(); //商户订单号,8-32位数字字母,可按自己规则产生,此处默认取demo演示页面传递的参数 param["merId"] = Request.Form["merId"].ToString(); //商户代码,请改成自己的测试商户号,此处默认取demo演示页面传递的参数 param["txnTime"] = Request.Form["txnTime"].ToString(); //订单发送时间,取系统时间,此处默认取demo演示页面传递的参数 //param["reserved"] = "{customPage=true}";//如果开通页面需要使用嵌入页面的话,请上送此用法 // 请求方保留域, // 透传字段,查询、通知、对账文件中均会原样出现,如有需要请启用并修改自己希望透传的数据。 // 出现部分特殊字符时可能影响解析,请按下面建议的方式填写: // 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("任意格式的信息都可以")); //支付卡信息填写 //可选送卡号、手机号、证件类型+证件号、姓名,也可以都不送,在界面输入这些要素 string accNo = "6226090000000048";//卡号 Dictionary <string, string> customerInfo = new Dictionary <string, string>(); customerInfo["phoneNo"] = "18100000000"; //手机号 customerInfo["certifTp"] = "01"; //证件类型,01-身份证 customerInfo["certifId"] = "510265790128303"; //证件号,15位身份证不校验尾号,18位会校验尾号,请务必在前端写好校验代码 customerInfo["customerNm"] = "张三"; //姓名 //param["accNo"] = accNo; //卡号,旧规范请按此方式填写 //param["customerInfo"] = AcpService.GetCustomerInfo(customerInfo, System.Text.Encoding.UTF8); //持卡人身份信息,旧规范请按此方式填写 param["accNo"] = AcpService.EncryptData(accNo, System.Text.Encoding.UTF8); //卡号,新规范请按此方式填写 param["customerInfo"] = AcpService.GetCustomerInfoWithEncrypt(customerInfo, System.Text.Encoding.UTF8); //持卡人身份信息,新规范请按此方式填写 // 订单超时时间。 // 超过此时间后,除网银交易外,其他交易银联系统会拒绝受理,提示超时。 跳转银行网银交易如果超时后交易成功,会自动退款,大约5个工作日金额返还到持卡人账户。 // 此时间建议取支付时的北京时间加15分钟。 // 超过超时时间调查询接口应答origRespCode不是A6或者00的就可以判断为失败。 param["payTimeout"] = DateTime.Now.AddMinutes(15).ToString("yyyyMMddHHmmss"); //以下信息非特殊情况不需要改动 param["version"] = SDKConfig.Version; //版本号 param["encoding"] = "UTF-8"; //编码方式 param["signMethod"] = SDKConfig.SignMethod; //签名方法 param["txnType"] = "79"; //交易类型 param["txnSubType"] = "00"; //交易子类 param["bizType"] = "000301"; //业务类型 param["accessType"] = "0"; //接入类型 param["channelType"] = "07"; //渠道类型 param["encryptCertId"] = AcpService.GetEncryptCertId(); //加密证书ID param["frontUrl"] = SDKConfig.FrontUrl; //前台通知地址 param["backUrl"] = SDKConfig.BackUrl; //后台通知地址 AcpService.Sign(param, System.Text.Encoding.UTF8); // 签名 string url = SDKConfig.FrontTransUrl; string html = AcpService.CreateAutoFormHtml(url, param, System.Text.Encoding.UTF8); Response.ContentEncoding = Encoding.UTF8; // 指定输出编码 Response.Write(html); }
protected void Page_Load(object sender, EventArgs e) { /** * 重要:联调测试时请仔细阅读注释! * * 产品:无跳转token产品<br> * 交易:查询开通:后台交易,无通知<br> * 日期: 2015-09<br> * 版本: 1.0.0 * 版权: 中国银联<br> * 说明:以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己需要,按照技术文档编写。该代码仅供参考,不提供编码性能规范性等方面的保障<br> * 交易说明:1)使用此交易获取token号。 * 2) 只能针对前台开通交易(银联侧)做查询。 */ 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["version"] = SDKConfig.Version; //版本号 param["encoding"] = "UTF-8"; //编码方式 param["signMethod"] = SDKConfig.SignMethod; //签名方法 param["txnType"] = "78"; //交易类型 param["txnSubType"] = "02"; //交易子类 param["bizType"] = "000902"; //业务类型 param["accessType"] = "0"; //接入类型 param["channelType"] = "07"; //渠道类型 param["encryptCertId"] = AcpService.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) { //开通成功 //TODO Response.Write("开通成功。<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"); } }