/// <summary> /// /// </summary> /// <param name="appId"></param> /// <param name="mchId"></param> /// <param name="body"></param> /// <param name="outTradeNo"></param> /// <param name="totalFee">单位:分</param> /// <param name="spbillCreateIp"></param> /// <param name="notifyUrl"></param> /// <param name="tradeType"></param> /// <param name="openid"></param> /// <param name="key"></param> /// <param name="nonceStr"></param> /// <param name="deviceInfo">自定义参数,可以为终端设备号(门店号或收银设备ID),PC网页或公众号内支付可以传"WEB",String(32)如:013467007045764</param> /// <param name="timeStart">订单生成时间,如果为空,则默认为当前服务器时间</param> /// <param name="timeExpire">订单失效时间,留空则不设置失效时间</param> /// <param name="detail">商品详细列表</param> /// <param name="attach">附加数据</param> /// <param name="feeType">符合ISO 4217标准的三位字母代码,默认人民币:CNY</param> /// <param name="goodsTag">商品标记,使用代金券或立减优惠功能时需要的参数,说明详见代金券或立减优惠。String(32),如:WXG</param> /// <param name="productId">trade_type=NATIVE时(即扫码支付),此参数必传。此参数为二维码中包含的商品ID,商户自行定义。String(32),如:12235413214070356458058</param> /// <param name="limitPay">是否限制用户不能使用信用卡支付</param> public TenPayV3UnifiedorderRequestData(string appId, string mchId, string body, string outTradeNo, int totalFee, string spbillCreateIp, string notifyUrl, TenPayV3Type tradeType, string openid, string key, string nonceStr, string deviceInfo = null, DateTime?timeStart = null, DateTime?timeExpire = null, string detail = null, string attach = null, string feeType = "CNY", string goodsTag = null, string productId = null, bool limitPay = false) { AppId = appId; MchId = mchId; DeviceInfo = deviceInfo; NonceStr = nonceStr; SignType = "MD5"; Body = body ?? "Senparc TenpayV3"; Detail = detail; Attach = attach; OutTradeNo = outTradeNo; FeeType = feeType; TotalFee = totalFee; SpbillCreateIP = spbillCreateIp; TimeStart = (timeStart ?? DateTime.Now).ToString("yyyyMMddHHmmss"); TimeExpire = timeExpire.HasValue ? timeExpire.Value.ToString("yyyyMMddHHmmss") : null; GoodsTag = goodsTag; NotifyUrl = notifyUrl; TradeType = tradeType; ProductId = productId; LimitPay = limitPay ? "no_credit" : null; OpenId = openid; Key = key; #region 设置RequestHandler //创建支付应答对象 PackageRequestHandler = new RequestHandler(null); //初始化 PackageRequestHandler.Init(); //设置package订单参数 //以下设置顺序按照官方文档排序,方便维护:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1 PackageRequestHandler.SetParameter("appid", this.AppId); //公众账号ID PackageRequestHandler.SetParameter("mch_id", this.MchId); //商户号 PackageRequestHandler.SetParameterWhenNotNull("device_info", this.DeviceInfo); //自定义参数 PackageRequestHandler.SetParameter("nonce_str", this.NonceStr); //随机字符串 PackageRequestHandler.SetParameterWhenNotNull("sign_type", this.SignType); //签名类型,默认为MD5 PackageRequestHandler.SetParameter("body", this.Body); //商品信息 PackageRequestHandler.SetParameterWhenNotNull("detail", this.Detail); //商品详细列表 PackageRequestHandler.SetParameterWhenNotNull("attach", this.Attach); //附加数据 PackageRequestHandler.SetParameter("out_trade_no", this.OutTradeNo); //商家订单号 PackageRequestHandler.SetParameterWhenNotNull("fee_type", this.FeeType); //符合ISO 4217标准的三位字母代码,默认人民币:CNY PackageRequestHandler.SetParameter("total_fee", this.TotalFee.ToString()); //商品金额,以分为单位(money * 100).ToString() PackageRequestHandler.SetParameter("spbill_create_ip", this.SpbillCreateIP); //用户的公网ip,不是商户服务器IP PackageRequestHandler.SetParameterWhenNotNull("time_start", this.TimeStart); //订单生成时间 PackageRequestHandler.SetParameterWhenNotNull("time_expire", this.TimeExpire); //订单失效时间 PackageRequestHandler.SetParameterWhenNotNull("goods_tag", this.GoodsTag); //商品标记 PackageRequestHandler.SetParameter("notify_url", this.NotifyUrl); //接收财付通通知的URL PackageRequestHandler.SetParameter("trade_type", this.TradeType.ToString()); //交易类型 PackageRequestHandler.SetParameterWhenNotNull("product_id", this.ProductId); //trade_type=NATIVE时(即扫码支付),此参数必传。 PackageRequestHandler.SetParameterWhenNotNull("limit_pay", this.LimitPay); //上传此参数no_credit--可限制用户不能使用信用卡支付 PackageRequestHandler.SetParameter("openid", this.OpenId); //用户的openId,trade_type=JSAPI时(即公众号支付),此参数必传 Sign = PackageRequestHandler.CreateMd5Sign("key", this.Key); PackageRequestHandler.SetParameter("sign", Sign); //签名 #endregion }
/// <summary> /// 普通商户 /// </summary> /// <param name="appId"></param> /// <param name="mchId"></param> /// <param name="body"></param> /// <param name="outTradeNo"></param> /// <param name="totalFee">单位:分</param> /// <param name="spbillCreateIp"></param> /// <param name="notifyUrl"></param> /// <param name="tradeType"></param> /// <param name="openid">trade_type=NATIVE时,OpenId应该为null</param> /// <param name="key"></param> /// <param name="nonceStr"></param> /// <param name="deviceInfo">自定义参数,可以为终端设备号(门店号或收银设备ID),PC网页或公众号内支付可以传"WEB",String(32)如:013467007045764</param> /// <param name="timeStart">订单生成时间,如果为空,则默认为当前服务器时间</param> /// <param name="timeExpire">订单失效时间,留空则不设置失效时间</param> /// <param name="detail">商品详细列表</param> /// <param name="attach">附加数据</param> /// <param name="feeType">符合ISO 4217标准的三位字母代码,默认人民币:CNY</param> /// <param name="goodsTag">商品标记,使用代金券或立减优惠功能时需要的参数,说明详见代金券或立减优惠。String(32),如:WXG</param> /// <param name="productId">trade_type=NATIVE时(即扫码支付),此参数必传。此参数为二维码中包含的商品ID,商户自行定义。String(32),如:12235413214070356458058</param> /// <param name="limitPay">是否限制用户不能使用信用卡支付</param> public TenPayV3UnifiedorderRequestData( string appId, string mchId, string body, string outTradeNo, int totalFee, string spbillCreateIp, string notifyUrl, TenPayV3Type tradeType, string openid, string key, string nonceStr, string deviceInfo = null, DateTime?timeStart = null, DateTime?timeExpire = null, string detail = null, string attach = null, string feeType = "CNY", string goodsTag = null, string productId = null, bool limitPay = false ) : this(appId, mchId, null, null, body, outTradeNo, totalFee, spbillCreateIp, notifyUrl, tradeType, openid, null, key, nonceStr, deviceInfo, timeStart, timeExpire, detail, attach, feeType, goodsTag, productId, limitPay) { }
/// <summary> /// /// </summary> /// <param name="appId"></param> /// <param name="mchId"></param> /// <param name="body"></param> /// <param name="outTradeNo"></param> /// <param name="totalFee"></param> /// <param name="spbillCreateIp"></param> /// <param name="notifyUrl"></param> /// <param name="tradeType"></param> /// <param name="openid"></param> /// <param name="key"></param> /// <param name="nonceStr"></param> public TenPayV3XmlDataInfo(string appId, string mchId, string body, string outTradeNo, decimal totalFee, string spbillCreateIp, string notifyUrl, TenPayV3Type tradeType, string openid, string key, string nonceStr) { AppId = appId; MchId = mchId; NonceStr = nonceStr; Body = body ?? "test"; OutTradeNo = outTradeNo; TotalFee = totalFee; SpbillCreateIP = spbillCreateIp; NotifyUrl = notifyUrl; TradeType = tradeType; OpenId = openid; Key = key; }
/// <summary> /// 创建预支付交易单 /// </summary> private UnifiedorderResult CreatePrePayOrder(TenPayV3Type payType, string orderNo, int amount, string body, string ip, string openId, string productId, string attach) { string nonceStr = String2.GetGuid(); string appId = JsApiAppId; string mchId = JsApiMchId; string key = JsApiKey; if (payType == TenPayV3Type.APP) { appId = AppAppId; mchId = AppMchId; key = AppKey; } var param = new TenPayV3UnifiedorderRequestData(appId, mchId, body, orderNo, amount, ip, NotifyUrl, payType, openId, key, nonceStr, productId: productId, attach: attach); var order = TenPayV3.Unifiedorder(param); return(order); }
/// <summary> /// /// </summary> /// <param name="appId"></param> /// <param name="mchId"></param> /// <param name="body"></param> /// <param name="outTradeNo"></param> /// <param name="totalFee"></param> /// <param name="spbillCreateIp"></param> /// <param name="notifyUrl"></param> /// <param name="tradeType"></param> /// <param name="openid"></param> /// <param name="key"></param> /// <param name="nonceStr"></param> public TenPayV3RequestData(string appId, string mchId, string body, string outTradeNo, decimal totalFee, string spbillCreateIp, string notifyUrl, TenPayV3Type tradeType, string openid, string key, string nonceStr) { AppId = appId; MchId = mchId; NonceStr = nonceStr; Body = body ?? "Senparc TenpayV3"; OutTradeNo = outTradeNo; TotalFee = totalFee; SpbillCreateIP = spbillCreateIp; NotifyUrl = notifyUrl; TradeType = tradeType; OpenId = openid; Key = key; #region 设置RequestHandler //创建支付应答对象 PackageRequestHandler = new RequestHandler(null); //初始化 PackageRequestHandler.Init(); //设置package订单参数 PackageRequestHandler.SetParameter("appid", this.AppId); //公众账号ID PackageRequestHandler.SetParameter("mch_id", this.MchId); //商户号 PackageRequestHandler.SetParameter("nonce_str", this.NonceStr); //随机字符串 PackageRequestHandler.SetParameter("body", this.NonceStr); //商品信息 PackageRequestHandler.SetParameter("out_trade_no", this.OutTradeNo); //商家订单号 PackageRequestHandler.SetParameter("total_fee", this.TotalFee.ToString()); //商品金额,以分为单位(money * 100).ToString() PackageRequestHandler.SetParameter("spbill_create_ip", this.SpbillCreateIP); //用户的公网ip,不是商户服务器IP PackageRequestHandler.SetParameter("notify_url", this.NotifyUrl); //接收财付通通知的URL PackageRequestHandler.SetParameter("trade_type", this.TradeType.ToString()); //交易类型 PackageRequestHandler.SetParameter("openid", this.OpenId); //用户的openId Sign = PackageRequestHandler.CreateMd5Sign("key", this.Key); PackageRequestHandler.SetParameter("sign", Sign); //签名 #endregion }
/// <summary> /// 获取参数 /// </summary> /// <param name="openId">用户的openId</param> /// <param name="outTradeNo">商家订单号</param> /// <param name="totalFee">商品金额, 以分为单位</param> /// <param name="body">商品信息</param> /// <param name="productId">二维码中包含的商品ID,商户自行定义。 </param> /// <param name="tradeType">交易类型</param> /// <returns></returns> public static WeChatUnifiedorderParamter GetSimpleParamter(string openId, string outTradeNo, int totalFee, string body, string productId, TenPayV3Type tradeType = TenPayV3Type.JSAPI) { return(new WeChatUnifiedorderParamter { TradeType = tradeType, OutTradeNo = outTradeNo, TotalFee = totalFee, Body = body, ProductId = productId, OpenId = openId }); }
/// <summary> /// 调用微信支付,生成预支付交易ID:prepay_id /// </summary> /// <param name="param">微信支付参数</param> /// <returns></returns> public WxPayReturn Pay(WxPayParam param) { string nonceStr = TenPayV3Util.GetNoncestr(); string notifyUrl = string.Format(param.Domain + param.NotifyUrl);//通知地址,接收微信支付异步通知回调地址 int totalFee = (int)(param.TotalFee * 100); TenPayV3Type tradeType = TenPayV3Type.JSAPI; switch (param.TradeType) { case TradeType.App: tradeType = TenPayV3Type.APP; break; case TradeType.JsApi: tradeType = TenPayV3Type.JSAPI; break; case TradeType.Native: tradeType = TenPayV3Type.NATIVE; break; } DateTime timeStart = DateTime.Now; DateTime timeExpire = DateTime.Now.AddHours(0.5); //设置参数 TenPayV3UnifiedorderRequestData requestData = new TenPayV3UnifiedorderRequestData( param.AppId, param.MchId, param.Body, param.OutTradeNo, totalFee, param.ServiceIpAddress, notifyUrl, tradeType, param.Openid, param.Key, nonceStr, param.DeviceInfo, timeStart, timeExpire, param.Detail, param.Attach, param.FeeType); var result = TenPayV3.Unifiedorder(requestData); LogHelper.Info(string.Format("生成预支付ID:{0}", JsonConvert.SerializeObject(result))); if (!result.IsReturnCodeSuccess()) { throw new BaseException(result.return_msg); } if (!result.IsResultCodeSuccess()) { throw new BaseException(result.err_code_des); } WxPayReturn wxPayReturn = new WxPayReturn(); wxPayReturn.ReturnCode = WxPayState.Success; if (param.TradeType == TradeType.Native) { wxPayReturn.CodeUrl = result.code_url; } wxPayReturn.PrepayId = result.prepay_id; wxPayReturn.DeviceInfo = result.device_info; return(wxPayReturn); }