第1肯定是配置的参数类

  1. public class JsApiConfig
  2. {
  3. #region 字段
  4. private string mch_id = string.Empty;
  5. private string key = string.Empty;
  6. private string appid = string.Empty;
  7. private string appsecret = string.Empty;
  8. private string redirect_url = string.Empty;
  9. private string notify_url = string.Empty;
  10. #endregion
  11.  
  12. public JsApiConfig(int wid, SysModuleNameEnum moduleName = SysModuleNameEnum.小程序商城)
  13. {
  14.  
  15. if (moduleName == SysModuleNameEnum.小程序商城)
  16. {
  17. BLL.minapp_setting settingBll = new BLL.minapp_setting();
  18. Model.minapp_setting setting = settingBll.GetModelByWid(wid);
  19. appid = setting.app_id; //绑定支付的APPID(必须配置)
  20. appsecret = setting.app_secret; //公众帐号secert(仅JSAPI支付的时候需要配置)
  21. }
  22. else if (moduleName == SysModuleNameEnum.微商城)
  23. {
  24. BLL.wx_userweixin uwxBll = new BLL.wx_userweixin();
  25. Model.wx_userweixin uwx = uwxBll.GetModel(wid);
  26.  
  27. appid = uwx.AppId; //绑定支付的APPID(必须配置)
  28. appsecret = uwx.AppSecret; //公众帐号secert(仅JSAPI支付的时候需要配置)
  29.  
  30. }
  31.  
  32. BLL.wx_payment_wxpay wxPayBll = new BLL.wx_payment_wxpay();
  33. Model.wx_payment_wxpay paymentInfo = wxPayBll.GetModelByWid(wid);
  34.  
  35. if (paymentInfo != null)
  36. {
  37.  
  38. mch_id = paymentInfo.mch_id; //商户号(必须配置)
  39. key = paymentInfo.paykey; //商户支付密钥,参考开户邮件设置(必须配置)
  40.  
  41. redirect_url = "";// MyCommFun.getAppSettingValue("webapi_url") + "/api/Pay/redirect_url";
  42. notify_url = MyCommFun.getAppSettingValue("webapi_url") + "/api/Pay/notify_url";
  43.  
  44. }
  45. }
  46.  
  47. #region 属性
  48. /// <summary>
  49. /// 商户号(必须配置)
  50. /// </summary>
  51. public string MchId
  52. {
  53. get { return mch_id; }
  54. set { mch_id = value; }
  55. }
  56.  
  57. /// <summary>
  58. /// 获取或设交易安全校验码
  59. /// </summary>
  60. public string Key
  61. {
  62. get { return key; }
  63. set { key = value; }
  64. }
  65.  
  66. /// <summary>
  67. /// 绑定支付的APPID(必须配置)
  68. /// </summary>
  69. public string AppId
  70. {
  71. get { return appid; }
  72. set { appid = value; }
  73. }
  74.  
  75. /// <summary>
  76. /// 公众帐号secert(仅JSAPI支付的时候需要配置)
  77. /// </summary>
  78. public string AppSecret
  79. {
  80. get { return appsecret; }
  81. set { appsecret = value; }
  82. }
  83.  
  84. /// <summary>
  85. /// 获取用户的OPENID回调地址
  86. /// </summary>
  87. public string Redirect_url
  88. {
  89. get { return redirect_url; }
  90. }
  91.  
  92. /// <summary>
  93. /// 获取服务器异步通知页面路径
  94. /// </summary>
  95. public string Notify_url
  96. {
  97. get { return notify_url; }
  98. }
  99.  
  100. #endregion
  101. }

第2就是正主来了,所有的微信支付的逻辑方法

  1. public class JsApiPay
  2. {
  3. /**
  4. *
  5. * 测速上报
  6. * @param string interface_url 接口URL
  7. * @param int timeCost 接口耗时
  8. * @param WxPayData inputObj参数数组
  9. */
  10. public static void ReportCostTime(int wid, string interface_url, int timeCost, WxPayData inputObj, SysModuleNameEnum moduleName = SysModuleNameEnum.小程序商城)
  11. {
  12. //如果仅失败上报
  13. if (inputObj.IsSet("return_code") && inputObj.GetValue("return_code").ToString() == "SUCCESS" &&
  14. inputObj.IsSet("result_code") && inputObj.GetValue("result_code").ToString() == "SUCCESS")
  15. {
  16. return;
  17. }
  18.  
  19. //上报逻辑
  20. WxPayData data = new WxPayData();
  21. data.SetValue("interface_url", interface_url);
  22. data.SetValue("execute_time_", timeCost);
  23. //返回状态码
  24. if (inputObj.IsSet("return_code"))
  25. {
  26. data.SetValue("return_code", inputObj.GetValue("return_code"));
  27. }
  28. //返回信息
  29. if (inputObj.IsSet("return_msg"))
  30. {
  31. data.SetValue("return_msg", inputObj.GetValue("return_msg"));
  32. }
  33. //业务结果
  34. if (inputObj.IsSet("result_code"))
  35. {
  36. data.SetValue("result_code", inputObj.GetValue("result_code"));
  37. }
  38. //错误代码
  39. if (inputObj.IsSet("err_code"))
  40. {
  41. data.SetValue("err_code", inputObj.GetValue("err_code"));
  42. }
  43. //错误代码描述
  44. if (inputObj.IsSet("err_code_des"))
  45. {
  46. data.SetValue("err_code_des", inputObj.GetValue("err_code_des"));
  47. }
  48. //商户订单号
  49. if (inputObj.IsSet("out_trade_no"))
  50. {
  51. data.SetValue("out_trade_no", inputObj.GetValue("out_trade_no"));
  52. }
  53. //设备号
  54. if (inputObj.IsSet("device_info"))
  55. {
  56. data.SetValue("device_info", inputObj.GetValue("device_info"));
  57. }
  58.  
  59. try
  60. {
  61. Report(wid, data, ,moduleName);
  62. }
  63. catch (WxPayException ex)
  64. {
  65. //不做任何处理
  66. }
  67. }
  68.  
  69. /**
  70. *
  71. * 测速上报接口实现
  72. * @param WxPayData inputObj 提交给测速上报接口的参数
  73. * @param int timeOut 测速上报接口超时时间
  74. * @throws WxPayException
  75. * @return 成功时返回测速上报接口返回的结果,其他抛异常
  76. */
  77. public static WxPayData Report(int wid, WxPayData inputObj, int timeOut = , SysModuleNameEnum moduleName = SysModuleNameEnum.小程序商城)
  78. {
  79. JsApiConfig jsApiConfig = new JsApiConfig(wid, moduleName);
  80. string url = "https://api.mch.weixin.qq.com/payitil/report";
  81. //检测必填参数
  82. if (!inputObj.IsSet("interface_url"))
  83. {
  84. throw new WxPayException("接口URL,缺少必填参数interface_url!");
  85. }
  86. if (!inputObj.IsSet("return_code"))
  87. {
  88. throw new WxPayException("返回状态码,缺少必填参数return_code!");
  89. }
  90. if (!inputObj.IsSet("result_code"))
  91. {
  92. throw new WxPayException("业务结果,缺少必填参数result_code!");
  93. }
  94. if (!inputObj.IsSet("user_ip"))
  95. {
  96. throw new WxPayException("访问接口IP,缺少必填参数user_ip!");
  97. }
  98. if (!inputObj.IsSet("execute_time_"))
  99. {
  100. throw new WxPayException("接口耗时,缺少必填参数execute_time_!");
  101. }
  102.  
  103. inputObj.SetValue("appid", jsApiConfig.AppId);//公众账号ID
  104. inputObj.SetValue("mch_id", jsApiConfig.MchId);//商户号
  105. inputObj.SetValue("user_ip", MXRequest.GetIP());//终端ip
  106. inputObj.SetValue("time", DateTime.Now.ToString("yyyyMMddHHmmss"));//商户上报时间
  107. inputObj.SetValue("nonce_str", GenerateNonceStr());//随机字符串
  108. inputObj.SetValue("sign", inputObj.MakeSign(jsApiConfig.Key));//签名
  109. string xml = inputObj.ToXml();
  110.  
  111. string response = HttpService.Post(xml, url, false, timeOut);
  112.  
  113. WxPayData result = new WxPayData();
  114. result.FromXml(response, jsApiConfig.Key);
  115. return result;
  116. }
  117.  
  118. /**
  119. * 生成时间戳,标准北京时间,时区为东八区,自1970年1月1日 0点0分0秒以来的秒数
  120. * @return 时间戳
  121. */
  122. public static string GenerateTimeStamp()
  123. {
  124. TimeSpan ts = DateTime.UtcNow - new DateTime(, , , , , , );
  125. return Convert.ToInt64(ts.TotalSeconds).ToString();
  126. }
  127.  
  128. /**
  129. * 生成随机串,随机串包含字母或数字
  130. * @return 随机串
  131. */
  132. public static string GenerateNonceStr()
  133. {
  134. return Guid.NewGuid().ToString().Replace("-", "");
  135. }
  136.  
  137. /// <summary>
  138. /// 接收从微信支付后台发送过来的数据暂不验证签名
  139. /// </summary>
  140. /// <returns>微信支付后台返回的数据</returns>
  141. public static WxPayData GetNotifyData()
  142. {
  143. string xml = @"<xml>
  144. <appid><![CDATA[wxa19e37b5749fecaf]]></appid>
  145. <attach><![CDATA[11|266|3259]]></attach>
  146. <bank_type><![CDATA[CFT]]></bank_type>
  147. <fee_type><![CDATA[CNY]]></fee_type>
  148. <is_subscribe><![CDATA[Y]]></is_subscribe>
  149. <mch_id><![CDATA[10011937]]></mch_id>
  150. <nonce_str><![CDATA[5d2b6c2a8db53831f7eda20af46e531c]]></nonce_str>
  151. <openid><![CDATA[o3qjz0N_nPDciLB0B8HegzkVqPfc]]></openid>
  152. <out_trade_no><![CDATA[b18061617463603]]></out_trade_no>
  153. <result_code><![CDATA[SUCCESS]]></result_code>
  154. <return_code><![CDATA[SUCCESS]]></return_code>
  155. <sign><![CDATA[B552ED6B279343CB493C5DD0D78AB241]]></sign>
  156. <sub_mch_id><![CDATA[10000100]]></sub_mch_id>
  157. <time_end><![CDATA[20140903131540]]></time_end>
  158. <total_fee>20</total_fee>
  159. <coupon_fee><![CDATA[0]]></coupon_fee>
  160. <coupon_count><![CDATA[0]]></coupon_count>
  161. <coupon_type><![CDATA[CASH]]></coupon_type>
  162. <coupon_id><![CDATA[0]]></coupon_id>
  163. <coupon_fee><![CDATA[0]]></coupon_fee>
  164. <trade_type><![CDATA[JSAPI]]></trade_type>
  165. <transaction_id><![CDATA[4200000109201806160140124926]]></transaction_id>
  166. </xml> ";
  167. //接收从微信后台POST过来的数据
  168. //if (1==1)
  169. //{//测试专用
  170.  
  171. System.IO.Stream s = HttpContext.Current.Request.InputStream;
  172. int count = ;
  173. byte[] buffer = new byte[];
  174. StringBuilder builder = new StringBuilder();
  175. while ((count = s.Read(buffer, , )) > )
  176. {
  177. builder.Append(Encoding.UTF8.GetString(buffer, , count));
  178. }
  179. s.Flush();
  180. s.Close();
  181. s.Dispose();
  182. // }
  183. //转换数据格式并验证签名
  184. WxPayData data = new WxPayData();
  185. try
  186. {
  187. LogHelper.Debug("builder.ToString()=" + builder.ToString(), , "微信支付回调", "获取回调数据xml", "GetNotifyData");
  188. data.FromXml(builder.ToString());
  189. // data.FromXml(xml);
  190. }
  191. catch (WxPayException ex)
  192. {
  193. //若有错误,则立即返回结果给微信支付后台
  194. WxPayData res = new WxPayData();
  195. res.SetValue("return_code", "FAIL");
  196. res.SetValue("return_msg", ex.Message);
  197. HttpContext.Current.Response.Write(res.ToXml());
  198. HttpContext.Current.Response.End();
  199. }
  200.  
  201. return data;
  202. }
  203.  
  204. /**
  205. *
  206. * 查询订单
  207. * @param WxPayData inputObj 提交给查询订单API的参数
  208. * @param int timeOut 超时时间
  209. * @throws WxPayException
  210. * @return 成功时返回订单查询结果,其他抛异常
  211. */
  212. public static WxPayData OrderQuery(int wid, WxPayData inputObj, int timeOut = , SysModuleNameEnum moduleName = SysModuleNameEnum.小程序商城)
  213. {
  214. string sendUrl = "https://api.mch.weixin.qq.com/pay/orderquery";
  215. //检测必填参数
  216. if (!inputObj.IsSet("out_trade_no") && !inputObj.IsSet("transaction_id"))
  217. {
  218. throw new WxPayException("订单查询接口中,out_trade_no、transaction_id至少填一个!");
  219. }
  220. JsApiConfig jsApiConfig = new JsApiConfig(wid);
  221. inputObj.SetValue("appid", jsApiConfig.AppId);//公众账号ID
  222. inputObj.SetValue("mch_id", jsApiConfig.MchId);//商户号
  223. inputObj.SetValue("nonce_str", GenerateNonceStr());//随机字符串
  224. inputObj.SetValue("sign", inputObj.MakeSign(jsApiConfig.Key));//签名
  225. string xml = inputObj.ToXml();
  226. var startTime = DateTime.Now; //开始时间
  227. string response = HttpService.Post(xml, sendUrl, false, timeOut);//调用HTTP通信接口提交数据
  228. var endTime = DateTime.Now; //结束时间
  229. int timeCost = (int)((endTime - startTime).TotalMilliseconds); //计算所用时间
  230. //将xml格式的数据转化为对象以返回
  231. WxPayData result = new WxPayData();
  232. result.FromXml(response, jsApiConfig.Key);
  233. ReportCostTime(wid, sendUrl, timeCost, result);//测速上报
  234. return result;
  235. }
  236.  
  237. }

JSSDK微信支付封装的支付类方法,代码比较齐全,适合收藏的更多相关文章

  1. (转载)Android支付宝支付封装代码

    Android支付宝支付封装代码 投稿:lijiao 字体:[增加 减小] 类型:转载 时间:2015-12-22我要评论 这篇文章主要介绍了Android支付宝支付封装代码,Android支付的时候 ...

  2. apicloud含有微信支付。支付宝支付和苹果内购的代码

    apicloud含有微信支付.支付宝支付和苹果内购的代码 <!DOCTYPE html> <html> <head> <meta charset=" ...

  3. JAVA微信支付——微信公众号内支付 代码

    官方文档:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1 微信PC二维码支付方式参考:https://www.cnblogs. ...

  4. asp.net core 微信扫码支付(扫码支付,H5支付,公众号支付,app支付)之1

    2018-08-13更新生成二维码的方法 在做微信支付前,首先要了解你需要什么方式的微信支付,目前本人做过的支付包含扫码支付.H5支付.公众号支付.App支付等,本人使用的是asp.net mvc c ...

  5. 【微信小程序】支付过程详解

    一.介绍 今天跟大家分享微信小程序集成支付. 二.分析 1.小程序支付API 地址:https://mp.weixin.qq.com/debug/wxadoc/dev/api/api-pay.html ...

  6. iOS----支付(微信支付、支付宝支付、银联支付控件集成支付)(转)

    资料 支付宝 //文档idk都包含了安卓.iOS版 银 联 银联官网资料 Demo Demo给了一个订单号,做测试使用,若出现支付失败什么的,可能是已经被别人给支付了,或者是服务器订单过期了 ~ 一. ...

  7. 微信二维码支付-模式一(PC端,解决中文乱码问题)

    近期公司调完银联,调支付宝,调完支付宝调微信.说实话微信的帮助文档确实是烂,而且有没有技术支持,害的我头发都掉了一桌.不说废话了,看代码. 首先登陆微信的公众平台(微信的服务号不是订阅号),然后选择微 ...

  8. 微信小程序实现支付功能

    小程序支付,没有封装支付代码:直接上一段可用的流程代码吧:微信小程序支付官网文档有详细的说明,这里我就不再赘述啦:客户端js: wx.request({ url:'https://www.xxxx.c ...

  9. 转《基于Ionic3实现微信支付和支付宝支付》

    在Ionic应用里实现支付并不难,但是有的坑真是不爬不知道. 一:支付宝支付 网上关于支付宝支付cordova插件真是非常多,但是大多会报一些让你很无语的错误.比如sdk早已过时不是最新的,或者没有出 ...

随机推荐

  1. linux 学习笔记 cpio命令

    1 文件或目录打包 打包有如下多种情况 A>包含子目录打包 find /usr/lib -print /cpio -o >/uo/temp1.cpio 将/usr/lib目录下的文件与子目 ...

  2. Django单表操作

    一.数据库相关设置 配置ORM的loggers日志: # 配置ORM的loggers日志 LOGGING = { 'version': 1, 'disable_existing_loggers': F ...

  3. url两次编码

    encodeURI函数采用UTF-8对URL进行编码,所以如果服务器在进行解码时使用的是其他的编码方式就会出现乱码,默认的服务器配置的解码字符集都不是UTF-8,所以大部分情况下地址栏提交中文查询参数 ...

  4. Java基础(十三) 文件高级技术

    文件高级技术 一.常见文件类型处理 一)属性文件 属性文件很简单,一行表示一个属性,属性就是键值对,键和值用(=)或者(:)分隔. #ready to work name = tang age = p ...

  5. 快速学习MarkDown语法及MarkDown拓展语法

    使用Markdown编辑器写博客 前半部分为效果后半部分为markdown格式,推荐开起两个窗口对比阅读 Markdown和扩展Markdown简洁的语法 代码块高亮 图片链接和图片上传 LaTex数 ...

  6. LINUX配置Django

    django项目: 依赖包[root@web01 ~]# yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-d ...

  7. Hass.io: add-on Configurator

    {   "username": "admin",   "password": "admin",   "cert ...

  8. Chrome中Vim插件cVim

    参考资料:http://blog.csdn.net/hk2291976/article/details/51280816 常用命令: k,w:上移; j,s:下移:h:向左:l:向右:u:上半页d:下 ...

  9. .net 4.0 中的特性总结(四):Tuple类型

    Tuple是具有指定数量和顺序的值的一种数据结构.针对这种数据结构,.Net4.0中提供了一组Tuple类型,具体如下: Tuple   Tuple<T>   Tuple<T1, T ...

  10. 移动端input中的placeholder属性垂直

    今天做项目时发现,在手机端用placeholder时,Android手机可以垂直显示:ISO则不能使placeholder垂直;解决办法: .gcddfadf-con-pay-1 input::-we ...