第1肯定是配置的参数类

 public class JsApiConfig
{
#region 字段
private string mch_id = string.Empty;
private string key = string.Empty;
private string appid = string.Empty;
private string appsecret = string.Empty;
private string redirect_url = string.Empty;
private string notify_url = string.Empty;
#endregion public JsApiConfig(int wid, SysModuleNameEnum moduleName = SysModuleNameEnum.小程序商城)
{ if (moduleName == SysModuleNameEnum.小程序商城)
{
BLL.minapp_setting settingBll = new BLL.minapp_setting();
Model.minapp_setting setting = settingBll.GetModelByWid(wid);
appid = setting.app_id; //绑定支付的APPID(必须配置)
appsecret = setting.app_secret; //公众帐号secert(仅JSAPI支付的时候需要配置)
}
else if (moduleName == SysModuleNameEnum.微商城)
{
BLL.wx_userweixin uwxBll = new BLL.wx_userweixin();
Model.wx_userweixin uwx = uwxBll.GetModel(wid); appid = uwx.AppId; //绑定支付的APPID(必须配置)
appsecret = uwx.AppSecret; //公众帐号secert(仅JSAPI支付的时候需要配置) } BLL.wx_payment_wxpay wxPayBll = new BLL.wx_payment_wxpay();
Model.wx_payment_wxpay paymentInfo = wxPayBll.GetModelByWid(wid); if (paymentInfo != null)
{ mch_id = paymentInfo.mch_id; //商户号(必须配置)
key = paymentInfo.paykey; //商户支付密钥,参考开户邮件设置(必须配置) redirect_url = "";// MyCommFun.getAppSettingValue("webapi_url") + "/api/Pay/redirect_url";
notify_url = MyCommFun.getAppSettingValue("webapi_url") + "/api/Pay/notify_url"; }
} #region 属性
/// <summary>
/// 商户号(必须配置)
/// </summary>
public string MchId
{
get { return mch_id; }
set { mch_id = value; }
} /// <summary>
/// 获取或设交易安全校验码
/// </summary>
public string Key
{
get { return key; }
set { key = value; }
} /// <summary>
/// 绑定支付的APPID(必须配置)
/// </summary>
public string AppId
{
get { return appid; }
set { appid = value; }
} /// <summary>
/// 公众帐号secert(仅JSAPI支付的时候需要配置)
/// </summary>
public string AppSecret
{
get { return appsecret; }
set { appsecret = value; }
} /// <summary>
/// 获取用户的OPENID回调地址
/// </summary>
public string Redirect_url
{
get { return redirect_url; }
} /// <summary>
/// 获取服务器异步通知页面路径
/// </summary>
public string Notify_url
{
get { return notify_url; }
} #endregion
}

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

public class JsApiPay
{
/**
*
* 测速上报
* @param string interface_url 接口URL
* @param int timeCost 接口耗时
* @param WxPayData inputObj参数数组
*/
public static void ReportCostTime(int wid, string interface_url, int timeCost, WxPayData inputObj, SysModuleNameEnum moduleName = SysModuleNameEnum.小程序商城)
{
//如果仅失败上报
if (inputObj.IsSet("return_code") && inputObj.GetValue("return_code").ToString() == "SUCCESS" &&
inputObj.IsSet("result_code") && inputObj.GetValue("result_code").ToString() == "SUCCESS")
{
return;
} //上报逻辑
WxPayData data = new WxPayData();
data.SetValue("interface_url", interface_url);
data.SetValue("execute_time_", timeCost);
//返回状态码
if (inputObj.IsSet("return_code"))
{
data.SetValue("return_code", inputObj.GetValue("return_code"));
}
//返回信息
if (inputObj.IsSet("return_msg"))
{
data.SetValue("return_msg", inputObj.GetValue("return_msg"));
}
//业务结果
if (inputObj.IsSet("result_code"))
{
data.SetValue("result_code", inputObj.GetValue("result_code"));
}
//错误代码
if (inputObj.IsSet("err_code"))
{
data.SetValue("err_code", inputObj.GetValue("err_code"));
}
//错误代码描述
if (inputObj.IsSet("err_code_des"))
{
data.SetValue("err_code_des", inputObj.GetValue("err_code_des"));
}
//商户订单号
if (inputObj.IsSet("out_trade_no"))
{
data.SetValue("out_trade_no", inputObj.GetValue("out_trade_no"));
}
//设备号
if (inputObj.IsSet("device_info"))
{
data.SetValue("device_info", inputObj.GetValue("device_info"));
} try
{
Report(wid, data, ,moduleName);
}
catch (WxPayException ex)
{
//不做任何处理
}
} /**
*
* 测速上报接口实现
* @param WxPayData inputObj 提交给测速上报接口的参数
* @param int timeOut 测速上报接口超时时间
* @throws WxPayException
* @return 成功时返回测速上报接口返回的结果,其他抛异常
*/
public static WxPayData Report(int wid, WxPayData inputObj, int timeOut = , SysModuleNameEnum moduleName = SysModuleNameEnum.小程序商城)
{
JsApiConfig jsApiConfig = new JsApiConfig(wid, moduleName);
string url = "https://api.mch.weixin.qq.com/payitil/report";
//检测必填参数
if (!inputObj.IsSet("interface_url"))
{
throw new WxPayException("接口URL,缺少必填参数interface_url!");
}
if (!inputObj.IsSet("return_code"))
{
throw new WxPayException("返回状态码,缺少必填参数return_code!");
}
if (!inputObj.IsSet("result_code"))
{
throw new WxPayException("业务结果,缺少必填参数result_code!");
}
if (!inputObj.IsSet("user_ip"))
{
throw new WxPayException("访问接口IP,缺少必填参数user_ip!");
}
if (!inputObj.IsSet("execute_time_"))
{
throw new WxPayException("接口耗时,缺少必填参数execute_time_!");
} inputObj.SetValue("appid", jsApiConfig.AppId);//公众账号ID
inputObj.SetValue("mch_id", jsApiConfig.MchId);//商户号
inputObj.SetValue("user_ip", MXRequest.GetIP());//终端ip
inputObj.SetValue("time", DateTime.Now.ToString("yyyyMMddHHmmss"));//商户上报时间
inputObj.SetValue("nonce_str", GenerateNonceStr());//随机字符串
inputObj.SetValue("sign", inputObj.MakeSign(jsApiConfig.Key));//签名
string xml = inputObj.ToXml(); string response = HttpService.Post(xml, url, false, timeOut); WxPayData result = new WxPayData();
result.FromXml(response, jsApiConfig.Key);
return result;
} /**
* 生成时间戳,标准北京时间,时区为东八区,自1970年1月1日 0点0分0秒以来的秒数
* @return 时间戳
*/
public static string GenerateTimeStamp()
{
TimeSpan ts = DateTime.UtcNow - new DateTime(, , , , , , );
return Convert.ToInt64(ts.TotalSeconds).ToString();
} /**
* 生成随机串,随机串包含字母或数字
* @return 随机串
*/
public static string GenerateNonceStr()
{
return Guid.NewGuid().ToString().Replace("-", "");
} /// <summary>
/// 接收从微信支付后台发送过来的数据暂不验证签名
/// </summary>
/// <returns>微信支付后台返回的数据</returns>
public static WxPayData GetNotifyData()
{
string xml = @"<xml>
<appid><![CDATA[wxa19e37b5749fecaf]]></appid>
<attach><![CDATA[11|266|3259]]></attach>
<bank_type><![CDATA[CFT]]></bank_type>
<fee_type><![CDATA[CNY]]></fee_type>
<is_subscribe><![CDATA[Y]]></is_subscribe>
<mch_id><![CDATA[10011937]]></mch_id>
<nonce_str><![CDATA[5d2b6c2a8db53831f7eda20af46e531c]]></nonce_str>
<openid><![CDATA[o3qjz0N_nPDciLB0B8HegzkVqPfc]]></openid>
<out_trade_no><![CDATA[b18061617463603]]></out_trade_no>
<result_code><![CDATA[SUCCESS]]></result_code>
<return_code><![CDATA[SUCCESS]]></return_code>
<sign><![CDATA[B552ED6B279343CB493C5DD0D78AB241]]></sign>
<sub_mch_id><![CDATA[10000100]]></sub_mch_id>
<time_end><![CDATA[20140903131540]]></time_end>
<total_fee>20</total_fee>
<coupon_fee><![CDATA[0]]></coupon_fee>
<coupon_count><![CDATA[0]]></coupon_count>
<coupon_type><![CDATA[CASH]]></coupon_type>
<coupon_id><![CDATA[0]]></coupon_id>
<coupon_fee><![CDATA[0]]></coupon_fee>
<trade_type><![CDATA[JSAPI]]></trade_type>
<transaction_id><![CDATA[4200000109201806160140124926]]></transaction_id>
</xml> ";
//接收从微信后台POST过来的数据
//if (1==1)
//{//测试专用 System.IO.Stream s = HttpContext.Current.Request.InputStream;
int count = ;
byte[] buffer = new byte[];
StringBuilder builder = new StringBuilder();
while ((count = s.Read(buffer, , )) > )
{
builder.Append(Encoding.UTF8.GetString(buffer, , count));
}
s.Flush();
s.Close();
s.Dispose();
// }
//转换数据格式并验证签名
WxPayData data = new WxPayData();
try
{
LogHelper.Debug("builder.ToString()=" + builder.ToString(), , "微信支付回调", "获取回调数据xml", "GetNotifyData");
data.FromXml(builder.ToString());
// data.FromXml(xml);
}
catch (WxPayException ex)
{
//若有错误,则立即返回结果给微信支付后台
WxPayData res = new WxPayData();
res.SetValue("return_code", "FAIL");
res.SetValue("return_msg", ex.Message);
HttpContext.Current.Response.Write(res.ToXml());
HttpContext.Current.Response.End();
} return data;
} /**
*
* 查询订单
* @param WxPayData inputObj 提交给查询订单API的参数
* @param int timeOut 超时时间
* @throws WxPayException
* @return 成功时返回订单查询结果,其他抛异常
*/
public static WxPayData OrderQuery(int wid, WxPayData inputObj, int timeOut = , SysModuleNameEnum moduleName = SysModuleNameEnum.小程序商城)
{
string sendUrl = "https://api.mch.weixin.qq.com/pay/orderquery";
//检测必填参数
if (!inputObj.IsSet("out_trade_no") && !inputObj.IsSet("transaction_id"))
{
throw new WxPayException("订单查询接口中,out_trade_no、transaction_id至少填一个!");
}
JsApiConfig jsApiConfig = new JsApiConfig(wid);
inputObj.SetValue("appid", jsApiConfig.AppId);//公众账号ID
inputObj.SetValue("mch_id", jsApiConfig.MchId);//商户号
inputObj.SetValue("nonce_str", GenerateNonceStr());//随机字符串
inputObj.SetValue("sign", inputObj.MakeSign(jsApiConfig.Key));//签名
string xml = inputObj.ToXml();
var startTime = DateTime.Now; //开始时间
string response = HttpService.Post(xml, sendUrl, false, timeOut);//调用HTTP通信接口提交数据
var endTime = DateTime.Now; //结束时间
int timeCost = (int)((endTime - startTime).TotalMilliseconds); //计算所用时间
//将xml格式的数据转化为对象以返回
WxPayData result = new WxPayData();
result.FromXml(response, jsApiConfig.Key);
ReportCostTime(wid, sendUrl, timeCost, result);//测速上报
return result;
} }

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. [python]UnicodeEncodeError: 'gbk' codec can't encode character '\ufffd'

    有关编码问题,一直以来都是十分头疼的问题.代码中的字符编码其实还好,但是由于使用的window系统,会用Window的默认编码去解析文本. 今天用脚本在写文件的时候,就总是弹出UnicodeEncod ...

  2. Java 8 (二) 新的时间API

    新的时间API 一)时间线 Instant对象:表示时间轴上的一个点,原点为1970-1-1的午夜. Duration对象:表示一段时间. 注意Instant和Duration类都是final. 二) ...

  3. LeetCode(169. 求众数)

    问题描述 给定一个大小为 n 的数组,找到其中的众数.众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素. 你可以假设数组是非空的,并且给定的数组总是存在众数. 示例 1: 输入: [3,2,3] ...

  4. 转 U-BOOT之stage1

    前言 本文主要是基于大家比较熟悉的 s3c2410 ,对移植 u-boot 时 stage1 过程进行一个分析,网上关于之方面的资料很多,但是几乎都只是对代码作注解,容易让人产生知其一不知其二的感觉, ...

  5. [ZJOI2013]K大数查询

    Description: 给定一个序列,支持两种操作 1.在[L,R]的每个位置上加上一个数 (注意一个位置上有多个数) 2.查询[L,R]上所有数中的第K大 Hint: \(n,m<=5e4\ ...

  6. mysql中注释的添加修改

    1 创建表的时候写注释,在使用comment关键字语法:create table 表名 (字段名 类型 comment '字段的注释' )comment='表的注释'; 查看一下 2 修改表的注释al ...

  7. [P1396]营救 (并查集)

    大佬都是用最短路做的 我用最小生成树 #include<bits/stdc++.h> #include<algorithm> using namespace std; stru ...

  8. mysql时间加减运算

    一.MySQL 获得当前日期时间 函数 1.1 获得当前日期 + 时间(date + time) 函数:now() mysql> select now();+———————+| now() |+ ...

  9. Class "xxxxx"defined without specifying a base class

    解决方法: 导入#import xxxx.h即可 程序需要了解整个类.所以需要添加 #import xxxx.h

  10. csrf 跨站请求伪造相关以及django的中间件

    django为用户实现防止跨站请求伪造的功能,通过中间件 django.middleware.csrf.CsrfViewMiddleware来完成. 1.django中常用的中间件? - proces ...