Commit 90111eb5 authored by liudong1993's avatar liudong1993
parents df5b4a86 47b327de
using Mall.Common.Plugin;
using System;
using System.Collections.Generic;
using System.Text;
namespace Mall.Common.Enum.Goods
{
public enum OrderPayTypeEnum
{
/// <summary>
/// 微信
/// </summary>
[EnumField("微信")]
WeChatPay = 1,
/// <summary>
/// 支付宝
/// </summary>
[EnumField("支付宝")]
Alipay = 2
}
}
......@@ -14,13 +14,6 @@ namespace Mall.Common.Pay.WeChatPat
/// </summary>
public class RequestHandler
{
private IHttpContextAccessor _accessor;
public RequestHandler(IHttpContextAccessor accessor)
{
_accessor = accessor;
}
/// <summary>
/// 请求的参数
/// </summary>
......@@ -171,6 +164,35 @@ namespace Mall.Common.Pay.WeChatPat
var sign = Plugin.SecurityHelper.MD5EncryptWeChat(sb.ToString(), GetCharset()).ToUpper();
return sign;
}
/// <summary>
/// 创建package签名,按参数名称a-z排序,遇到空值的参数不参加签名。
/// </summary>
/// <returns></returns>
public string CreateMd5Sign(IHttpContextAccessor accessor)
{
var sb = new StringBuilder();
var akeys = new ArrayList(Parameters.Keys);
akeys.Sort();
foreach (string k in akeys)
{
var v = (string)Parameters[k];
if (null != v && String.Compare("", v, StringComparison.Ordinal) != 0
&& String.Compare("sign", k, StringComparison.Ordinal) != 0 && String.Compare("key", k, StringComparison.Ordinal) != 0)
{
sb.Append(k + "=" + v + "&");
}
}
sb.Append("key=" + GetKey());
var sign = Plugin.SecurityHelper.MD5EncryptWeChat(sb.ToString(), GetCharset(accessor)).ToUpper();
return sign;
}
/// <summary>
/// 创建sha1签名
/// </summary>
......@@ -269,18 +291,37 @@ namespace Mall.Common.Pay.WeChatPat
/// 获取编号
/// </summary>
/// <returns></returns>
protected virtual string GetCharset()
protected virtual string GetCharset(IHttpContextAccessor accessor)
{
//return "UTF-8";
try
{
return HttpHelper.GetRequestEncoding(_accessor.HttpContext.Request).BodyName; // HttpContext.Current.Request.ContentEncoding.BodyName;
return HttpHelper.GetRequestEncoding(accessor.HttpContext.Request).BodyName; // HttpContext.Current.Request.ContentEncoding.BodyName;
}
catch (Exception)
{
return "UTF-8";
}
}
/// <summary>
/// 获取编号
/// </summary>
/// <returns></returns>
protected virtual string GetCharset()
{
return "UTF-8";
//try
//{
// return HttpHelper.GetRequestEncoding(accessor.HttpContext.Request).BodyName; // HttpContext.Current.Request.ContentEncoding.BodyName;
//}
//catch (Exception)
//{
// return "UTF-8";
//}
}
}
}
......@@ -3,6 +3,7 @@ using System;
using System.Collections.Generic;
using System.Text;
using Mall.Model.Entity.Product;
using Mall.Common.Enum.Goods;
namespace Mall.Model.Extend.Product
{
......@@ -108,6 +109,21 @@ namespace Mall.Model.Extend.Product
/// </summary>
public int? User_Coupon_Id { get; set; }
/// <summary>
/// 支付方式
/// </summary>
public OrderPayTypeEnum? OrderPayType { get; set; }
/// <summary>
/// 唯一识别码
/// </summary>
public string OpenId
{
get;
set;
}
#region 订单导入
/// <summary>
......@@ -156,12 +172,14 @@ namespace Mall.Model.Extend.Product
public string DName { get; set; }
#endregion
>>>>>>> 61e2df8d6e7f6e7b0ef4482885c6e6b79d1870e7
}
/// <summary>
/// 订单优惠金额
/// </summary>
public class RB_Goods_CouponModel {
public class RB_Goods_CouponModel
{
/// <summary>
/// 商品id
/// </summary>
......
......@@ -561,6 +561,7 @@ namespace Mall.Module.User
{ nameof(RB_MiniProgram_Extend.WeChatApiSecret),extModel.WeChatApiSecret},
{ nameof(RB_MiniProgram_Extend.WeChatPayCertificate),extModel.WeChatPayCertificate},
{ nameof(RB_MiniProgram_Extend.WeChatPayPrivateKey),extModel.WeChatPayPrivateKey},
{ nameof(RB_MiniProgram_Extend.WeChatPayCertificateUrl),extModel.WeChatPayCertificateUrl},
};
flag = programRepository.Update(fileds, new WhereHelper(nameof(RB_MiniProgram_Extend.MallBaseId), extModel.MallBaseId));
}
......
......@@ -15,6 +15,7 @@ using Mall.Common.Plugin;
using Mall.Model.Entity.User;
using Mall.Common;
using Mall.Model.Extend.User;
using NPOI.SS.Formula.Functions;
namespace Mall.WebApi.App_Code
{
......@@ -39,6 +40,98 @@ namespace Mall.WebApi.App_Code
public PayUtil() { }
// <summary>
/// 传入订单号OrderNumber,RefundNumber,总金额total_fee(分),RefundFee退款金额(分),
/// </summary>
/// <param name="param"></param>
/// <returns></returns>
public BaseResult Refund(PayParam param)
{
if (param.TotalFee == null || param.RefundFee == null || string.IsNullOrWhiteSpace(param.OrderNumber) || string.IsNullOrWhiteSpace(param.RefundNumber))
{
return new BaseResult() { IsSuccess = false, Message = "参数错误!" };
}
#region 财付通退款,已OK
//var packageReq = new RequestHandler(context);
//packageReq.SetKey(Key);
//packageReq.SetParameter("partner", "1225604801");
//packageReq.SetParameter("out_trade_no", param.OrderNumber);
//packageReq.SetParameter("out_refund_no", param.OrderNumber);
//packageReq.SetParameter("total_fee", param.TotalFee.Value.ToString(CultureInfo.InvariantCulture));
//packageReq.SetParameter("refund_fee", param.RefundFee.Value.ToString(CultureInfo.InvariantCulture));
//packageReq.SetParameter("op_user_id", "1225604801");
//packageReq.SetParameter("op_user_passwd", "111111");
//packageReq.SetParameter("sign", packageReq.CreateSign());
//var httpClient = new HttpUtil();
////httpClient.SetCharset(context.Request.ContentEncoding.BodyName);
////这里很神奇,必须要用 GB2312编码,不能通过 context.Request.ContentEncoding.BodyName获取编码
//httpClient.SetCharset("gb2312");
//httpClient.SetCertInfo(WeChatCertPath, WeChatCertPwd);
//var reqXml = packageReq.GetRequestURL();
//var result = httpClient.Send(reqXml, "https://mch.tenpay.com/refundapi/gateway/refund.xml");
//var xe = XElement.Parse(result, LoadOptions.SetLineInfo);
//return new BaseResult() { IsSuccess = false };
#endregion
#region 微信退款
RB_MiniProgram model = new RB_MiniProgram();
var packageReq = new RequestHandler();
packageReq.SetKey(model.WeChatApiSecret);
packageReq.SetParameter("appid", model.MiniAppId);
packageReq.SetParameter("mch_id", model.WeChatPayMerchants);
packageReq.SetParameter("nonce_str", GetNoncestr());
//packageReq.SetParameter("transaction_id", param.OrderNumber);
packageReq.SetParameter("out_trade_no", param.OrderNumber);
packageReq.SetParameter("out_refund_no", param.RefundNumber);
packageReq.SetParameter("total_fee", (param.TotalFee.Value).ToString(CultureInfo.InvariantCulture));
packageReq.SetParameter("refund_fee", param.RefundFee.Value.ToString(CultureInfo.InvariantCulture));
//packageReq.SetParameter("op_user_id", param.WeChatType.Equals(WeChatType.Public) ? EheMall.WeChat.Common.WeChatConfig.GetMchId() : EheMall.WeChat.Common.WeChatConfig.GetOpenMchID());//操作员,默认为商户号
packageReq.SetParameter("sign", packageReq.CreateMd5Sign());
var reqXml = packageReq.ParseXml();
var result = Common.Pay.WeChatPat.HttpHelper.Post(new HttpParam()
{
Url = "https://api.mch.weixin.qq.com/secapi/pay/refund",
PostParam = reqXml,
Encoding = Common.Pay.WeChatPat.HttpHelper.GetRequestEncoding(_accessor.HttpContext.Request), //HttpContext.Current.Request.ContentEncoding,
CertPath =model.WeChatPayCertificateUrl, //Path.Combine(AppDomain.CurrentDomain.BaseDirectory, param.WeChatType.Equals(WeChatType.Public) ? EheMall.WeChat.Common.WeChatConfig.GetCertPath() : EheMall.WeChat.Common.WeChatConfig.GetOpenCertPath()),
CertPwd =model.WeChatApiSecret// param.WeChatType.Equals(WeChatType.Public) ? EheMall.WeChat.Common.WeChatConfig.GetCertPwd() : EheMall.WeChat.Common.WeChatConfig.GetOpenCertPwd()
});
var xe = XElement.Parse(result, LoadOptions.SetLineInfo);
var returnCode = xe.GetElement("return_code").Value;
//退款成功
if (returnCode.Equals("SUCCESS"))
{
var resultCode = xe.GetElement("result_code").Value;
if (resultCode.Equals("SUCCESS"))
{
var outTradeNo = xe.GetElement("out_trade_no").Value;
//在外面回写订单
return new BaseResult()
{
IsSuccess = true,
Data = new Dictionary<string, string>
{
{"OrderNumber", outTradeNo}
}
};
}
}
var errCodeDes = xe.GetElement("err_code_des") == null ? "" : xe.GetElement("err_code_des").Value;
var returnMsg = xe.GetElement("return_msg") == null ? "" : xe.GetElement("return_msg").Value;
return new BaseResult() { IsSuccess = false, Message = returnMsg + errCodeDes };
#endregion
}
/// <summary>
/// 支付
/// </summary>
......@@ -139,173 +232,19 @@ namespace Mall.WebApi.App_Code
/// <summary>
/// 微信小程序支付
/// </summary>
/// <param name="sOrderNo"></param>
/// <param name="sProductName"></param>
/// <param name="dPrice"></param>
/// <param name="CustomerId"></param>
/// <param name="openid"></param>
/// <returns></returns>
public string GetMinUnifiedOrder(string sOrderNo, string sProductName, decimal dPrice, string CustomerId, string openid, RB_MiniProgram model)
{
var req = new RequestHandler();
req.SetKey(model.WeChatApiSecret);
//
req.SetParameter("appid", model.MiniAppId);//微信开放平台审核通过的应用APPID
req.SetParameter("mch_id", model.WeChatPayMerchants);//微信支付分配的商户号
req.SetParameter("nonce_str", GetNoncestr());//随机字符串,不长于32位
req.SetParameter("body", sProductName);
req.SetParameter("attach", CustomerId);
req.SetParameter("out_trade_no", sOrderNo);
req.SetParameter("total_fee", (dPrice * 100).ToString("f0"));
req.SetParameter("spbill_create_ip", _accessor.HttpContext.Connection.RemoteIpAddress.ToString());
//req.SetParameter("spbill_create_ip",IPHelper.GetClientIP());
req.SetParameter("spbill_create_ip", "");
req.SetParameter("time_start", DateTime.Now.ToString("yyyyMMddHHmmss"));
req.SetParameter("time_expire", DateTime.Now.AddMinutes(10).ToString("yyyyMMddHHmmss"));
req.SetParameter("notify_url", Config.sTenpayNotify);
req.SetParameter("trade_type", "JSAPI");
req.SetParameter("openid", openid);
req.SetParameter("sign", req.CreateMd5Sign());
var reqXml = req.ParseXml();
var result = Common.Pay.WeChatPat.HttpHelper.Post(new HttpParam()
{
Url = Mall.Common.Pay.WeChatPat.Model.ApiList.UnifiedOrderUrl,
PostParam = reqXml,
Encoding = Encoding.UTF8
// Encoding = HttpContext.Current.Request.ContentEncoding
});
var xe = XElement.Parse(result, LoadOptions.SetLineInfo);
LogHelper.Write(null, "订单号【" + sOrderNo + "】支付错误:" + xe);
try
{
var prepayId = xe.GetElement("prepay_id").Value;
var payReq = new RequestHandler();
payReq.SetKey(model.WeChatApiSecret);
payReq.SetParameter("appId", model.MiniAppId);
// req.SetParameter("mch_id", EheMall.WeChat.Common.WeChatConfig.GetOpenMchID());//微信支付分配的商户号
payReq.SetParameter("timeStamp", PayUtil.GetTimestamp());
payReq.SetParameter("nonceStr", PayUtil.GetNoncestr());
payReq.SetParameter("package", "prepay_id=" + prepayId);
payReq.SetParameter("signType", "MD5");
//创建签名
payReq.SetParameter("sign", payReq.CreateMd5Sign());
var payReqXml = payReq.ParseXml();
var payReqJson = payReq.ParseJson();
return payReqJson;
}
catch (Exception)
{
var returnCode = xe.GetElement("return_code").Value;
var returnMsg = xe.GetElement("return_msg").Value;
return "{Error:'" + returnCode + returnMsg + "'}";
}
}
/// <summary>
/// 传入ProductName,OrderNumber,TotalFee,TimeExpire,OpenId(可选),TradeType,NotifyUrl(可选)
/// </summary>
/// <param name="param"></param>
/// <returns></returns>
public string GetUnifiedOrder(RB_MiniProgram_Extend model, PayParam param = null)
{
if (param.TotalFee == null || string.IsNullOrWhiteSpace(param.ProductName) || string.IsNullOrWhiteSpace(param.OrderNumber) || param.TradeType == null || param.MallBaseId == 0 || param.TenantId == 0)
{
return "参数错误";
}
var req = new RequestHandler();
req.SetKey(model.WeChatApiSecret);
req.SetParameter("appid", model.MiniAppId);//微信开放平台审核通过的应用APPID
req.SetParameter("mch_id", model.WeChatPayMerchants);//微信支付分配的商户号
req.SetParameter("nonce_str", GetNoncestr());
req.SetParameter("body", param.ProductName);
req.SetParameter("attach", param.IsRecharge.ToString());
req.SetParameter("out_trade_no", param.OrderNumber);
req.SetParameter("total_fee", param.TotalFee.ToString());
req.SetParameter("spbill_create_ip", _accessor.HttpContext.Connection.RemoteIpAddress.ToString());
// req.SetParameter("spbill_create_ip", IPHelper.GetClientIP());
req.SetParameter("time_start", DateTime.Now.ToString("yyyyMMddHHmmss"));
req.SetParameter("time_expire", DateTime.Now.AddMinutes(10).ToString("yyyyMMddHHmmss"));
req.SetParameter("notify_url",
string.IsNullOrWhiteSpace(param.NotifyUrl) ? Config.sTenpayNotify : param.NotifyUrl);
req.SetParameter("trade_type", param.TradeType.ToString());
if (!string.IsNullOrWhiteSpace(param.OpenId))
{
req.SetParameter("openid", param.OpenId);
}
req.SetParameter("sign", req.CreateMd5Sign());
var reqXml = req.ParseXml();
var result = Common.Pay.WeChatPat.HttpHelper.Post(new HttpParam()
{
Url = ApiList.UnifiedOrderUrl,
PostParam = reqXml,
Encoding = Common.Pay.WeChatPat.HttpHelper.GetRequestEncoding(_accessor.HttpContext.Request), //HttpContext.Current.Request.ContentEncoding
});
return result;
}
/// <summary>
/// 传入 OpenId,订单Id,金额(分),过期时间(20141010121314),商品名称。
/// </summary>
/// <returns></returns>
public string CreateJSAPIPayJson(PayParam param)
{
if (param.TotalFee == null || string.IsNullOrWhiteSpace(param.ProductName) || string.IsNullOrWhiteSpace(param.OrderNumber) || param.TradeType == null || param.MallBaseId == 0 || param.TenantId == 0)
{
return "参数错误";
}
//根据订单号获取微信支付配置信息
RB_MiniProgram_Extend model = new RB_MiniProgram_Extend(); //2020年5月26号新增
model = programModule.GetMiniProgramModule(new RB_MiniProgram_Extend { MallBaseId = param.MallBaseId, TenantId = param.TenantId });
param.TradeType = TradeType.JSAPI;
var result = GetUnifiedOrder(model, param);
var xe = XElement.Parse(result, LoadOptions.SetLineInfo);
try
{
var prepayId = xe.GetElement("prepay_id").Value;
var payReq = new RequestHandler();
payReq.SetKey(model.WeChatApiSecret);
payReq.SetParameter("appId", model.MiniAppId);
payReq.SetParameter("timeStamp", PayUtil.GetTimestamp());
payReq.SetParameter("nonceStr", PayUtil.GetNoncestr());
payReq.SetParameter("package", "prepay_id=" + prepayId);
payReq.SetParameter("signType", "MD5");
//创建签名
payReq.SetParameter("sign", payReq.CreateMd5Sign());
var payReqXml = payReq.ParseXml();
var payReqJson = payReq.ParseJson();
return payReqJson;
}
catch (Exception ex)
{
var returnCode = xe.GetElement("return_code").Value;
var returnMsg = xe.GetElement("return_msg").Value;
LogHelper.Write(ex, "订单号支付错误:" + xe);
return "{Error:'" + returnCode + returnMsg + "'}";
}
}
/// <summary>
/// 获取随机字符串
/// </summary>
/// <returns></returns>
public static string GetNoncestr()
public string GetNoncestr()
{
var random = new Random();
return SecurityHelper.MD5EncryptWeChat(random.Next(1000).ToString(CultureInfo.InvariantCulture), "GBK");
......@@ -315,7 +254,7 @@ namespace Mall.WebApi.App_Code
/// 获取时间戳
/// </summary>
/// <returns></returns>
public static string GetTimestamp()
public string GetTimestamp()
{
var ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
return Convert.ToInt64(ts.TotalSeconds).ToString(CultureInfo.InvariantCulture);
......@@ -327,7 +266,7 @@ namespace Mall.WebApi.App_Code
/// <param name="instr"></param>
/// <param name="charset">默认值:utf-8</param>
/// <returns></returns>
public static string UrlEncode(string instr, string charset)
public string UrlEncode(string instr, string charset)
{
if (instr == null || instr.Trim() == "")
return "";
......
......@@ -9,78 +9,16 @@ using Mall.Common.Plugin;
using Mall.WebApi.Filter;
using Microsoft.AspNetCore.Cors;
using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json.Linq;
namespace Mall.WebApi.Controllers.AppletWeChat
{
[Route("api/[controller]/[action]")]
[ApiExceptionFilter]
[ApiController]
[EnableCors("AllowCors")]
public class WeChatNotifyController : BaseController
public class WeChatNotifyController : Controller
{
private static object _lock = new object();
/// <summary>
/// 微信支付方法
/// </summary>
/// <param name="sOrderNo"></param>
/// <param name="sCurOpenID"></param>
/// <returns></returns>
[HttpGet]
[HttpPost]
public ApiResult DoPay(string sOrderNo, string sCurOpenID = "")
{
if (string.IsNullOrWhiteSpace(sCurOpenID))
{
return ApiResult.Failed("OpenId不能为空!");
}
string result = "";
//判断订单信息
//var model = new REBORN.Module.SellModule.CounponOrderModule().GetEntity(Convert.ToInt32(sOrderNo));
//if (model == null)
//{
// return ApiResult.Failed("订单信息不存在!");
//}
//if (model.OrderState == 2)
//{
// return ApiResult.Failed("订单已支付");
//}
//if (model.OrderState == 3)
//{
// return ApiResult.Failed("订单已取消");
//}
var payParam = new Common.Pay.WeChatPat.PayParam()
{
TotalFee = 1,// Convert.ToInt32(model.PreferPrice * 100),//总价,单位:分。2500即25元
OpenId = sCurOpenID,//支付用户的OpenId
OrderNumber = (System.DateTime.Now.ToString("yyyyMMddHHmmssfff")) + sOrderNo,
ProductName = "测试商品名称", //model.ProductName,
IsRecharge = false
};
try
{
LogHelper.Write(null, "DoPay-H5:" + payParam);
App_Code.PayUtil PayUtil = new App_Code.PayUtil();
result = PayUtil.CreateJSAPIPayJson(payParam);
return ApiResult.Success("", result);
}
catch (Exception ex)
{
if (ex.Message.Contains("timed out"))
{
App_Code.PayUtil PayUtil = new App_Code.PayUtil();
var json = PayUtil.CreateJSAPIPayJson(payParam);
return ApiResult.Success("", json);
}
}
return ApiResult.Success();
}
/// <summary>
......@@ -157,5 +95,16 @@ namespace Mall.WebApi.Controllers.AppletWeChat
//告诉微信我们处理失败,请继续调用我们的接口。好像是会重试8次。
}
}
}
\ No newline at end of file
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Xml.Linq;
using Mall.Common;
using Mall.Common.API;
using Mall.Common.Pay.WeChatPat;
using Mall.Common.Pay.WeChatPat.Model;
using Mall.Common.Plugin;
using Mall.Model.Extend.Product;
using Mall.Model.Extend.User;
using Mall.Module.User;
using Mall.WebApi.Filter;
using Mall.WeChat.Helper;
using Microsoft.AspNetCore.Cors;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
namespace Mall.WebApi.Controllers.AppletWeChat
{
[Route("api/[controller]/[action]")]
[ApiExceptionFilter]
[ApiController]
[EnableCors("AllowCors")]
public class WeChatPayController : BaseController
{
private IHttpContextAccessor _accessor;
/// <summary>
/// 构造函数
/// </summary>
/// <param name="accessor"></param>
public WeChatPayController(IHttpContextAccessor accessor)
{
_accessor = accessor;
}
/// <summary>
/// 商户小程序处理类
/// </summary>
private Module.User.MiniProgramModule programModule = new Module.User.MiniProgramModule();
private readonly UserModule userModule = new UserModule();
/// <summary>
/// 微信支付
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
public ApiResult GetPayInfo()
{
var request = RequestParm;
var userInfo = AppletUserInfo;
var userModel = userModule.GetMemberUserInfo(21233);
if (userInfo == null)
{
userInfo = new Common.AppletUserInfo();
userInfo.TenantId = userModel.TenantId;
userInfo.MallBaseId = userModel.MallBaseId;
userInfo.UserId = userModel.Id;
}
RB_Goods_Order_Extend demodel = JsonConvert.DeserializeObject<RB_Goods_Order_Extend>(request.msg.ToString());
string sPayInfo = string.Empty;
if (!demodel.OrderPayType.HasValue)
{
return ApiResult.Failed("请选择支付方式!");
}
var model = new Module.Product.OrderModule().GetOrderInfo(demodel.OrderId);
if (model == null)
{
return ApiResult.Failed("订单信息不存在!");
}
if (model.OrderStatus == Common.Enum.Goods.OrderStatusEnum.Cancel)
{
return ApiResult.Failed("订单已取消");
}
if ((int)model.OrderStatus > 1)
{
return ApiResult.Failed("订单已支付");
}
string sOrderNo = (System.DateTime.Now.ToString("yyyyMMddHHmmssfff")) + model.OrderId;
//根据订单号获取微信支付配置信息
RB_MiniProgram_Extend miniProgram = new RB_MiniProgram_Extend(); //2020年5月26号新增
miniProgram = programModule.GetMiniProgramModule(new RB_MiniProgram_Extend { MallBaseId = userInfo.MallBaseId, TenantId = userInfo.TenantId });
App_Code.PayUtil payUtil = new App_Code.PayUtil();
switch ((int)demodel.OrderPayType)
{
case 1://微信支付
sPayInfo = GetMinUnifiedOrder(sOrderNo, demodel.GoodsName, model.Income.Value, model.UserId.ToString(), demodel.OpenId, miniProgram);
break;
default:
break;
}
return ApiResult.Success("", sPayInfo);
}
/// <summary>
/// 微信小程序支付
/// </summary>
/// <param name="sOrderNo"></param>
/// <param name="sProductName"></param>
/// <param name="dPrice"></param>
/// <param name="CustomerId"></param>
/// <param name="openid"></param>
/// <returns></returns>
private string GetMinUnifiedOrder(string sOrderNo, string sProductName, decimal dPrice, string CustomerId, string openid, RB_MiniProgram_Extend model)
{
App_Code.PayUtil payUtil = new App_Code.PayUtil();
var req = new Common.Pay.WeChatPat.RequestHandler();
req.SetKey(model.WeChatApiSecret);
//
req.SetParameter("appid", model.MiniAppId);//微信开放平台审核通过的应用APPID
req.SetParameter("mch_id", model.WeChatPayMerchants);//微信支付分配的商户号
req.SetParameter("nonce_str", payUtil.GetNoncestr());//随机字符串,不长于32位
req.SetParameter("body", sProductName);
req.SetParameter("attach", CustomerId);
req.SetParameter("out_trade_no", sOrderNo);
req.SetParameter("total_fee", (dPrice * 100).ToString("f0"));
req.SetParameter("spbill_create_ip", _accessor.HttpContext.Connection.RemoteIpAddress.ToString());
req.SetParameter("time_start", DateTime.Now.ToString("yyyyMMddHHmmss"));
req.SetParameter("time_expire", DateTime.Now.AddMinutes(10).ToString("yyyyMMddHHmmss"));
req.SetParameter("notify_url", Config.sTenpayNotify);
req.SetParameter("trade_type", "JSAPI");
req.SetParameter("openid", openid);
req.SetParameter("sign", req.CreateMd5Sign(_accessor));
var reqXml = req.ParseXml();
var result = Common.Pay.WeChatPat.HttpHelper.Post(new HttpParam()
{
Url = Mall.Common.Pay.WeChatPat.Model.ApiList.UnifiedOrderUrl,
PostParam = reqXml,
Encoding = Common.Pay.WeChatPat.HttpHelper.GetRequestEncoding(_accessor.HttpContext.Request),
// Encoding = HttpContext.Current.Request.ContentEncoding
});
var xe = XElement.Parse(result, LoadOptions.SetLineInfo);
LogHelper.Write(null, "订单号【" + sOrderNo + "】支付错误:" + xe);
try
{
var prepayId = xe.GetElement("return_code").Value;
var payReq = new RequestHandler();
payReq.SetParameter("appId", model.MiniAppId);
//创建签名
payReq.SetParameter("sign", payReq.CreateMd5Sign(_accessor));
var payReqXml = payReq.ParseXml();
var payReqJson = payReq.ParseJson();
return payReqJson;
}
catch (Exception)
{
var returnCode = xe.GetElement("return_code").Value;
var returnMsg = xe.GetElement("return_msg").Value;
return "{Error:'" + returnCode + returnMsg + "'}";
}
}
/// <summary>
/// 企业付款
/// </summary>
/// <param name="sOrderNo"></param>
/// <param name="sProductName"></param>
/// <param name="dPrice"></param>
/// <param name="CustomerId"></param>
/// <param name="openid"></param>
/// <returns></returns>
private string GetTransfersOrder(string sOrderNo, string sProductName, decimal dPrice, string CustomerId, string openid, RB_MiniProgram_Extend model)
{
App_Code.PayUtil payUtil = new App_Code.PayUtil();
var req = new Common.Pay.WeChatPat.RequestHandler();
req.SetKey(model.WeChatApiSecret);
//
req.SetParameter("mch_appid", model.MiniAppId);//微信开放平台审核通过的应用APPID
req.SetParameter("mchid", model.WeChatPayMerchants);//微信支付分配的商户号
req.SetParameter("nonce_str", payUtil.GetNoncestr());//随机字符串,不长于32位
req.SetParameter("sign", req.CreateMd5Sign(_accessor));
req.SetParameter("partner_trade_no", sProductName);//商户订单号,需保持唯一性(只能是字母或者数字,不能包含有其它字符)
req.SetParameter("openid", openid);
req.SetParameter("check_name", "NO_CHECK");
req.SetParameter("out_trade_no", sOrderNo);
req.SetParameter("amount", (dPrice * 100).ToString("f0"));
req.SetParameter("spbill_create_ip", _accessor.HttpContext.Connection.RemoteIpAddress.ToString());
req.SetParameter("time_start", DateTime.Now.ToString("yyyyMMddHHmmss"));
req.SetParameter("time_expire", DateTime.Now.AddMinutes(10).ToString("yyyyMMddHHmmss"));
req.SetParameter("desc", "赞羊商城佣金提现");
req.SetParameter("trade_type", "JSAPI");
var reqXml = req.ParseXml();
var result = Common.Pay.WeChatPat.HttpHelper.Post(new HttpParam()
{
Url = "https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers",
PostParam = reqXml,
Encoding = Common.Pay.WeChatPat.HttpHelper.GetRequestEncoding(_accessor.HttpContext.Request),
CertPath = model.WeChatPayCertificateUrl,
CertPwd = model.WeChatApiSecret
});
var xe = XElement.Parse(result, LoadOptions.SetLineInfo);
LogHelper.Write(null, "订单号【" + sOrderNo + "】支付错误:" + xe);
try
{
var prepayId = xe.GetElement("prepay_id").Value;
var payReq = new RequestHandler();
payReq.SetKey(model.WeChatApiSecret);
payReq.SetParameter("appId", model.MiniAppId);
// req.SetParameter("mch_id", EheMall.WeChat.Common.WeChatConfig.GetOpenMchID());//微信支付分配的商户号
payReq.SetParameter("timeStamp", payUtil.GetTimestamp());
payReq.SetParameter("nonceStr", payUtil.GetNoncestr());
payReq.SetParameter("package", "prepay_id=" + prepayId);
payReq.SetParameter("signType", "MD5");
//创建签名
payReq.SetParameter("sign", payReq.CreateMd5Sign(_accessor));
var payReqXml = payReq.ParseXml();
var payReqJson = payReq.ParseJson();
return payReqJson;
}
catch (Exception)
{
var returnCode = xe.GetElement("return_code").Value;
var returnMsg = xe.GetElement("return_msg").Value;
return "{Error:'" + returnCode + returnMsg + "'}";
}
}
}
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment