C#接入第三方支付一些小问题
13年第一次接入支付宝的时候,支付宝的api还不是很好用,费了些劲才完成,本月再次接入的时候发现已经很好用了,接入过程非常顺畅,只出现了一个小问题,我的金额默认是保留了4位小数,支付宝api只接受最多两位小数,开始的时候没注意,一直报参数错误。
在接入支付宝和微信支付的时候,都有一个需要,就是根据参数名进行排名拼接,为了方便,写了两个小方法来进行这一步:
支付宝:
- public static string GetSignStr(SortedDictionary<string, string> sParaTemp)
- {
- List<string> NameList = sParaTemp.Keys.ToList();
- NameList.Sort();
- string Str = "";
- try
- {
- foreach (var item in NameList)
- {
- if (string.IsNullOrEmpty(sParaTemp[item]))
- continue;
- if (Str != "")
- Str += "&";
- Str += item + "=" + sParaTemp[item];
- }
- }
- catch (Exception)
- {
- }
- return Str;
- }
微信:
- public static string GetSignStr(object param)
- {
- List<PropertyInfo> smList = param.GetType().GetProperties().ToList();
- List<string> NameList = new List<string>();
- foreach (var item in smList)
- {
- NameList.Add(item.Name);
- }
- NameList.Sort();
- string Str = "";
- try
- {
- foreach (var item in NameList)
- {
- PropertyInfo pInfo = smList.FirstOrDefault(p => p.Name == item);
- if (pInfo == null)
- continue;
- object value = pInfo.GetValue(param, null);
- if (value == null)
- continue;
- if (Str != "")
- Str += "&";
- Str += item + "=" + value;
- }
- }
- catch (Exception)
- {
- }
- return Str;
- }
由于项目是pc网站,所以微信支付采用了扫码支付,需要把预支付生成的链接生成二维码图片,这里用了ThoughtWorks来进行,代码如下:
- public static string GetQRCodeBmp(string link, string name)
- {
- string filepath = "";
- try
- {
- QRCodeEncoder qrCodeEncoder = new QRCodeEncoder();
- qrCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE;
- qrCodeEncoder.QRCodeScale = ;
- qrCodeEncoder.QRCodeVersion = ;
- qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.M;
- Bitmap bmp = qrCodeEncoder.Encode(link);
- string BasePath = System.Web.Hosting.HostingEnvironment.MapPath("~/");
- string QRCodePath = "Files/QRCode/";
- if (!Directory.Exists(BasePath + QRCodePath))
- Directory.CreateDirectory(BasePath + QRCodePath);
- filepath = BasePath + QRCodePath + name + ".jpg";
- bmp.Save(filepath, ImageFormat.Jpeg);
- return QRCodePath + name + ".jpg";
- }
- catch (Exception ex)
- {
- }
- return filepath;
- }
另外,微信支付的MD5加密需要UTF8格式(去年接入过微信支付,当时签名问题还有xml格式序列化问题调试了N次才通过,此次就用的现成的了):
- public static string EncryptUTF8(string source)
- {
- string md5String = string.Empty;
- try
- {
- byte[] byteCode = System.Text.Encoding.UTF8.GetBytes(source);
- byteCode = new System.Security.Cryptography.MD5CryptoServiceProvider().ComputeHash(byteCode);
- for (int i = ; i < byteCode.Length; i++)
- {
- md5String += byteCode[i].ToString("x").PadLeft(, '');
- }
- }
- catch (Exception ex)
- {
- md5String = ex.ToString();
- return md5String;
- }
- return md5String;
- }
支付宝支付,如果完全按照官方Demo改造,在subject包含中文时会出现IE上提交错误,这是因为IE的默认编码格式不是Demo统一的utf-8,解决办法就是在拼接提交的form表单时直接给外部加上html,head,body标签,并指定编码格式,这样就不会使用浏览器默认编码格式了:
- /// <summary>
- /// 建立请求,以表单HTML形式构造(默认)
- /// </summary>
- /// <param name="sParaTemp">请求参数数组</param>
- /// <param name="strMethod">提交方式。两个值可选:post、get</param>
- /// <param name="strButtonValue">确认按钮显示文字</param>
- /// <returns>提交表单HTML文本</returns>
- public static string BuildRequest(SortedDictionary<string, string> sParaTemp, string strMethod, string strButtonValue)
- {
- //待请求参数数组
- Dictionary<string, string> dicPara = new Dictionary<string, string>();
- dicPara = BuildRequestPara(sParaTemp);
- StringBuilder sbHtml = new StringBuilder();
- sbHtml.Append("<html>");
- sbHtml.Append("<head>");
- sbHtml.Append("<meta http-equiv='Content-Type' content='text/html; charset=utf-8' />");
- sbHtml.Append("</head>");
- sbHtml.Append("<body>");
- sbHtml.Append("<form id='alipaysubmit' name='alipaysubmit' action='" + GATEWAY_NEW + "_input_charset=" + _input_charset + "' method='" + strMethod.ToLower().Trim() + "'>");
- foreach (KeyValuePair<string, string> temp in dicPara)
- {
- sbHtml.Append("<input type='hidden' name='" + temp.Key + "' value='" + temp.Value + "'/>");
- }
- //submit按钮控件请不要含有name属性
- sbHtml.Append("<input type='submit' value='" + strButtonValue + "' style='display:none;'></form>");
- sbHtml.Append("<script>document.forms['alipaysubmit'].submit();</script>");
- sbHtml.Append("</body>");
- sbHtml.Append("</html>");
- return sbHtml.ToString();
- }
加粗部分就是在Demo基础上加的。
C#接入第三方支付一些小问题的更多相关文章
- 第三方支付设计——账户体系
第三方支付架构设计之-帐户体系 一, 什么是第三方支付? 什么是第三方支付?相信很多人对这个名字很熟悉,不管是从各种媒体等都经常听到,可以说是耳熟能熟.但,如果非得给这个名词 ...
- 使用Tornado异步接入第三方(支付宝)支付
目前国内比较流行的第三方支付主要有支付宝和微信支付,博主最近研究了下如何用Python接入支付宝支付,这里我以Tornado作为web框架,接入支付宝构造支付接口. 使用Tornado异步接入支付宝支 ...
- 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_6-1.常用的第三方支付和聚合支付介绍
笔记 第六章 开发在线教育视频站点核心业务之从零基础接入 微信扫一扫网页支付 1.常用的第三方支付和聚合支付介绍 简介:介绍常用的第三方支付和聚合支付 1.什么是第三方支付 第 ...
- Android中集成第三方支付
常见的第三方支付解决方案 支付宝支付 微信支付 银联支付 Ping++统一支付平台(需要继承服务器端和客户端) 短信支付 支付宝的集成流程 相关资料链接: 支付宝支付指引流程:支付指引流程 支付宝An ...
- 第三方支付设计——自有账户支付
笔者在上一篇blog<<第三方支付架构设计之-帐户体系>>中已经稍微全面的阐述了第三方支付架构设计中的账户体系,在该体系中,其实涉及了各种各样的账户:银行侧账户(包括用户在银行 ...
- Android 接入支付宝支付实现
接上篇android接入微信支付文章,这篇我们带你来接入支付宝支付服务 简介 首先要说明的是个人感觉接入支付宝比微信简单多了,很轻松的,所以同学们不要紧张~ 当然还是老规矩啦,上来肯定的贴上官网地址, ...
- Android接入支付宝支付实现
接上篇android接入微信支付文章,这篇我们带你来接入支付宝支付服务 简介 首先要说明的是个人感觉接入支付宝比微信简单多了,很轻松的,所以同学们不要紧张~ 当然还是老规矩啦,上来肯定的贴上官网地址, ...
- PC、h5项目接入第三方支付宝扫码登录、扫码付款
首先介绍一下pc项目接入支付宝扫码支付. 1.pc.移动接入支付宝扫码支付. 其实这个逻辑很简单,前端所需要处理的不是很多,后台会给一个连接,前端只需要将要支付的订单id拼接在这个连接上,然后打开跳转 ...
- 微信支付之扫码支付、公众号支付、H5支付、小程序支付相关业务流程分析总结
前言 很久以来,一直想写一篇微信支付有关的总结文档:一方面是总结自己的一些心得,另一方面也可以帮助别人,但是因种种原因未能完全理解透彻微信支付的几大支付方式,今天有幸做一些总结上的文章,也趁此机会,将 ...
随机推荐
- 转:LINQ教程一:LINQ简介
原文地址:https://www.cnblogs.com/dotnet261010/p/8278793.html 一.为什么要使用LINQ 要理解为什么使用LINQ,先来看下面一个例子.假设有一个整数 ...
- Bequeath Connection and SYS Logon
The following example illustrates how to use the internal_logon and SYSDBA arguments to specify the ...
- pip/pip3国内源
Error 在使用pip3安装PySide2时出现ReadTimeoutError. $ pip3 install PySide2 Solution 使用国内源 例如: $ pip3 install ...
- 使用 Cordova 打包 app
1.安装nodejs 2.安装 cordova npm install -g cordova 3.Cordova 打包成安卓APK需要用到ANT打包工具,首先配置好java环境: 下载安装Java J ...
- Django-搭建win7虚拟环境-virtualenv
为什么要配置Django虚拟环境? 例如:在开发Python Django的时候,系统安装的Python3只有一个版本:3.6.所有第三方的包都会被pip安装到Python3的site-package ...
- hdu 5182 PM2.5
问题描述 目前,我们用PM2.5的含量来描述空气质量的好坏.一个城市的PM2.5含量越低,它的空气质量就越好.所以我们经常按照PM2.5的含量从小到大对城市排序.一些时候某个城市的排名可能上升,但是他 ...
- C#关键字详解第三节
byte:字节 字节是计算机信息技术用于计量存储容量的一种计量单位,通常情况下一字节等于八位,也在一些计算机编程 语言中表示数据类型和语言字符.这是百度百科给出的解释,在C#语言中byte也可以是一种 ...
- TASKLIST 显示计算机上的所有进程
Tasklist"是 winxp/win2003/vista/win7/win8下的命令,用来显示运行在本地或远程计算机上的所有进程,带有多个执行参数. 使用格式 tasklist [/s ...
- CentOS 6.5下mysql的安装与配置
一.通过yum自动安装mysql yum install mysql-server my-client 二.初始化及相关配置 安装完mysql数据库以后,会发现会多出一个mysqld的服务,通过输入 ...
- LINUX 内核内存管理
https://linux-mm.org/ http://www.cnblogs.com/liloke/archive/2011/11/20/2255737.html