首页 > 编程语言 >使用第三方库(Senparc)完成小程序支付

使用第三方库(Senparc)完成小程序支付

时间:2024-09-11 10:48:27浏览次数:8  
标签:fee string DebugFormat 程序 Senparc resHandler var Logger 第三方

1.添加第三方库,如下图:

2.支付代码:

复制代码
/// <summary>
/// 支付
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
[Route("Pay")]
public WeixinJsPaySignature Pay(PayRequest model)
{

string timeStamp = "";
string nonceStr = "";
string paySign = "";

string sp_billno = GeneratorHelper.GeneratorOrderNo();
using (var context = new TwoPoleRentContext())
{
var devcie = context.Devices.FirstOrDefault(c => c.DeviceCode == model.DeviceId);
if (devcie == null)
{

return null;
}
var supplier = context.Suppliers.FirstOrDefault(c => c.OpenId == model.OpenId);
var order = new Order()
{
OrderId = Guid.NewGuid(),
OrderCode = sp_billno,
OrderName = Constants.OrderName,
OrderPrice = model.Total,
PayType = PayType.WxPay,
OrderState = OrderState.Pending,
OrderTotalMoney = model.Total,
CreatedOn = DateTime.Now,
SupplierId = supplier.Id,
DeviceId = devcie.Id,
ModifiedOn = DateTime.Now
};
context.Orders.Add(order);
context.SaveChanges();

}

//创建支付应答对象
RequestHandler packageReqHandler = new RequestHandler(null);
//初始化
packageReqHandler.Init();

timeStamp = TenPayV3Util.GetTimestamp();
Logger.DebugFormat("支付timeStamp{0}", timeStamp);
nonceStr = TenPayV3Util.GetNoncestr();

Logger.DebugFormat("支付nonceStr{0}", nonceStr);
var productName = "易考星";

//设置package订单参数
packageReqHandler.SetParameter("appid", Constants.AppID);    //公众账号ID
packageReqHandler.SetParameter("mch_id", Constants.TenPay3MchId);    //商户号
packageReqHandler.SetParameter("nonce_str", nonceStr); //随机字符串
packageReqHandler.SetParameter("body", productName); //商品信息
packageReqHandler.SetParameter("out_trade_no", sp_billno);    //商家订单号
//todo 充数据库配置获取价格
packageReqHandler.SetParameter("total_fee", (model.Total * Constants.WeixinRedPackRatio/1000).ToString());    //商品金额,以分为单位(money * 100).ToString()
packageReqHandler.SetParameter("spbill_create_ip", Request.GetClientIpAddress()); //用户的公网ip,不是商户服务器IP
packageReqHandler.SetParameter("notify_url", string.Format("{0}/Api/WeixinPay/PayNotifyUrl", Constants.WeixinWebsite));    //接收财付通通知的URL
packageReqHandler.SetParameter("trade_type", TenPayV3Type.JSAPI.ToString());    //交易类型
packageReqHandler.SetParameter("openid", model.OpenId); //用户的openId
Logger.DebugFormat("支付OpenId{0}", model.OpenId);
string sign = packageReqHandler.CreateMd5Sign("key", Constants.TenPayV3Key);

Logger.DebugFormat("支付sign{0}", sign);
packageReqHandler.SetParameter("sign", sign); //签名

string data = packageReqHandler.ParseXML();
Logger.DebugFormat("支付data{0}", data);
var resultPay = TenPayV3.Unifiedorder(data);
var res = XDocument.Parse(resultPay);
Logger.DebugFormat("支付result{0}", resultPay);
Logger.DebugFormat("支付res{0}", res);
string prepayId = res.Element("xml").Element("prepay_id").Value;
Logger.DebugFormat("支付prepayId{0}", prepayId);
//设置支付参数
RequestHandler paySignReqHandler = new RequestHandler(null);

paySignReqHandler.SetParameter("appId", Constants.AppID);

paySignReqHandler.SetParameter("timeStamp", timeStamp);
paySignReqHandler.SetParameter("nonceStr", nonceStr);

paySignReqHandler.SetParameter("package", string.Format("prepay_id={0}", prepayId));
paySignReqHandler.SetParameter("signType", "MD5");

paySign = paySignReqHandler.CreateMd5Sign("key", Constants.TenPayV3Key);

var jsmodel = new WeixinJsPaySignature
{
AppId = Constants.AppID,
Timestamp = timeStamp,
NonceStr = nonceStr,
Package = string.Format("prepay_id={0}", prepayId),
PaySign = paySign,
OrderId = sp_billno
};
return jsmodel;
}
复制代码

 

3.回调:

复制代码
/// <summary>
/// 支付回调
/// </summary>
/// <returns></returns>
[Route("PayNotifyUrl")]
public HttpResponseMessage PayNotifyUrl()
{
Logger.Debug("PayNotifyUrl");
ResponseHandler resHandler = new ResponseHandler(null);

var _xml = resHandler.ParseXML();
Logger.InfoFormat(_xml);

string result_code = resHandler.GetParameter("result_code");
Logger.DebugFormat("result_code-{0}", result_code);

string fee_type = resHandler.GetParameter("fee_type");
Logger.DebugFormat("fee_type-{0}", fee_type);

string return_code = resHandler.GetParameter("return_code");
Logger.DebugFormat("return_code-{0}", return_code);

string total_fee = resHandler.GetParameter("total_fee");
Logger.DebugFormat("total_fee-{0}", total_fee);

string return_msg = resHandler.GetParameter("return_msg");
Logger.DebugFormat("return_msg-{0}", return_msg);

string mch_id = resHandler.GetParameter("mch_id");
Logger.DebugFormat("mch_id-{0}", mch_id);

string cash_fee = resHandler.GetParameter("cash_fee");
Logger.DebugFormat("cash_fee-{0}", cash_fee);

string openid = resHandler.GetParameter("openid");
Logger.DebugFormat("openid-{0}", openid);

string transaction_id = resHandler.GetParameter("transaction_id");
Logger.DebugFormat("transaction_id-{0}", transaction_id);

string sign = resHandler.GetParameter("sign");
Logger.DebugFormat("sign-{0}", sign);

string bank_type = resHandler.GetParameter("bank_type");
Logger.DebugFormat("bank_type-{0}", bank_type);

string appid = resHandler.GetParameter("appid");
Logger.DebugFormat("appid-{0}", appid);

string time_end = resHandler.GetParameter("time_end");
Logger.DebugFormat("time_end-{0}", time_end);

string trade_type = resHandler.GetParameter("trade_type");
Logger.DebugFormat("trade_type-{0}", trade_type);

string nonce_str = resHandler.GetParameter("nonce_str");
Logger.DebugFormat("nonce_str-{0}", nonce_str);

string is_subscribe = resHandler.GetParameter("is_subscribe");
Logger.DebugFormat("is_subscribe-{0}", is_subscribe);

string out_trade_no = resHandler.GetParameter("out_trade_no");
Logger.DebugFormat("out_trade_no-{0}", out_trade_no);

Logger.DebugFormat("TotalFee:{0},CashFee:{1}", decimal.Parse(total_fee), decimal.Parse(cash_fee));
string xml = string.Format(@"<xml>
<return_code><![CDATA[{0}]]></return_code>
<return_msg><![CDATA[{1}]]></return_msg>
</xml>", return_code, return_msg);
try
{
using (var context = new TwoPoleRentContext())
{
var pay = new Pay()
{
//PayId = Guid.NewGuid(),
PayState = PayState.OrderSuccess,
PayType = PayType.WxPay,
ResultCode = result_code,
FeeType = fee_type,
ReturnCode = return_code,
TotalFee = decimal.Parse(total_fee),
MchId = mch_id,
CashFee = decimal.Parse(cash_fee),
TransactionId = transaction_id,
Sign = sign,
BankType = bank_type,
Appid = appid,
TimeEnd = DateTime.Now,
TradeType = trade_type,
NonceStr = nonce_str,
OrderCode = out_trade_no,
CreatedOn = DateTime.Now,
ModifiedOn = DateTime.Now
};
var order = context.Orders.Include("Device").FirstOrDefault(d => d.OrderCode == out_trade_no);
if (order==null||order.PayId != null)
{
return new HttpResponseMessage { Content = new StringContent(xml, Encoding.GetEncoding("UTF-8"), "text/plain") };
}
//更新设备使用情况
var deviceUsage = context.DeviceUsages.FirstOrDefault(c => c.DeviceId == order.DeviceId);

var hours = (double) (order.OrderPrice/order.Device.UnitPrice);
if (deviceUsage==null)
{
deviceUsage=new DeviceUsage
{
DeviceId =order.DeviceId,
StarTime = DateTime.Now,
EndTime = DateTime.Now.AddHours(hours)
};
context.DeviceUsages.Add(deviceUsage);
}
else
{
if (deviceUsage.EndTime>DateTime.Now)
{
deviceUsage.EndTime= deviceUsage.EndTime.AddHours(hours);
}
else
{
deviceUsage.StarTime=DateTime.Now;
deviceUsage.EndTime = DateTime.Now.AddHours(hours);
}
}
order.PayId = pay.Id;
order.PayType = (int)PayType.WxPay;
order.OrderState = OrderState.Paid;
context.Pays.Add(pay);
//教练提成
var divided = context.Divideds.FirstOrDefault(c => c.SupplierId == order.SupplierId);
if (divided==null)
{
Logger.Error(string.Format("设备提成未配置,订单号:{0},设备编号:{1}", out_trade_no, order.SupplierId));
}
else
{
var money=divided.DividedState==DividedState.FixedAmount?divided.FixedAmount:order.OrderPrice*divided.Percentage;
var account = context.Accounts.FirstOrDefault(c => c.Id == order.SupplierId);

if (account==null)
{
account=new Account
{
Id = order.SupplierId,
UserMoney = money,
DepositForzeMoney=0,
DepositLeftMoney=0,
};
context.Accounts.Add(account);
}
else
{
account.UserMoney += money;
}
var accountDetail = new AccountDetail
{
AccountId = account.Id,
UserMoney = money,
FrozenMoney=0,
DetailType = DepositDetailType.DetailCharge,
DetailState = DetailState.DetailSuccess,
OrderSource = out_trade_no,

};
account.AccountDetails.Add(accountDetail);
}

var result = context.SaveChanges() > 0;
Logger.InfoFormat("pay_result:{0}", result);

}
}
catch (Exception ex)
{
Logger.Error(string.Format("支付回调出错,{0}",ex));
}

return new HttpResponseMessage { Content = new StringContent(xml, Encoding.GetEncoding("UTF-8"), "text/plain") };
}
复制代码

 

5.小程序端代码:

复制代码
pay: function () {
wx.showLoading({
title: '正在支付'
})
app.httpService("weixinPay/Pay",
{
openId: this.data.openid,
Total: this.data.Total,
deviceId: this.data.deviceId
},
function (res) {
console.log(res)
wx.hideLoading()
if (res) {
wx.requestPayment({
'timeStamp': res.Timestamp,
'nonceStr': res.NonceStr,
'package': res.Package,
'signType': 'MD5',
'paySign': res.PaySign,
'success': function (res) {
wx.showToast({
title: '支付成功,欢迎使用驾考设备',
icon: 'none',
duration: 3000
});
},
'fail': function (res) {
wx.showToast({
title: '支付失败,请重新支付',
icon: 'none',
duration: 2000
});
}
})
}
})
},
复制代码

 

标签:fee,string,DebugFormat,程序,Senparc,resHandler,var,Logger,第三方
From: https://www.cnblogs.com/Alex80/p/18407839

相关文章

  • 小程序资料
    小程序登录授权并获取手机号    Senparc.Weixin微信NETSDK     小程序手机号授权(uniapp+盛派SDK)帮你踩坑    小程序登录及用户信息/手机号   小程序登录授权及手机号获取  第三方库(Senparc)完成小程序支付   ......
  • springboot+vue校园流浪猫管理平台【程序+论文+开题】计算机毕业设计
    系统程序文件列表开题报告内容研究背景在现代化的大学校园中,流浪猫作为非人为饲养却常驻校园的特殊群体,它们不仅为师生们的生活增添了几分温馨与乐趣,也面临着生存环境的挑战与健康问题。随着校园内流浪猫数量的增加,如何有效管理、保护这些小生命,确保它们得到必要的关怀与救......
  • springboot+vue学院电子政务系统【程序+论文+开题】计算机毕业设计
    系统程序文件列表开题报告内容研究背景随着信息技术的飞速发展,电子政务已成为提升政府及教育机构管理效率、优化服务流程、增强信息透明度的重要手段。学院作为培养未来社会栋梁的摇篮,其内部管理与服务水平的提升直接关系到教育质量与学生满意度。然而,传统的手工管理模式在......
  • 小程序开发费用揭秘:影响微信小程序价格的因素有哪些?
    微信小程序的开发费用因具体需求和开发方式而异。以下是一些影响微信小程序开发费用的因素:功能和复杂度:微信小程序的功能和复杂度直接影响开发费用。简单的小程序可能只需要几千元,而复杂的小程序可能需要数万元或更高。设计和用户体验:微信小程序的设计和用户体验也会影响开......
  • 程序员下班以后做什么副业合适?
    我就是一个最普通的网络安全工程师,出道快10年了,不出意外地遭遇到瓶颈期,但是凭技术在各大平台挖漏洞副业,硬是妥妥扛过来了。因为对于程序员来讲,这是个试错成本很低、事半功倍的选择。编程技能是一种强大生产力,决定程序员是一个高薪职业,同时由于技术迭代太快,决定程序员也是一......
  • Python之异常处理与程序调试(Exception Handling and Program Debugging in Python)
    ......
  • springboot+vue疫情防控物业信息采集系统【程序+论文+开题】计算机毕业设计
    系统程序文件列表开题报告内容研究背景随着全球疫情的持续影响,物业管理作为社区疫情防控的第一线,其重要性日益凸显。传统物业管理方式在面对疫情时,往往存在信息采集不全、效率低下、响应滞后等问题,难以有效支撑精准防控的需求。因此,开发一套高效、智能的疫情防控物业信息采......
  • springboot+vue有机农场客户关系管理系统的设计与实现【程序+论文+开题】计算机毕业设
    系统程序文件列表开题报告内容研究背景随着消费者对食品安全及健康饮食需求的日益增长,有机农场作为提供无污染、纯天然农产品的重要基地,其市场地位日益凸显。然而,传统农场管理模式在面对日益复杂的客户群体、多样化的需求及高效运营要求时显得力不从心。特别是在客户关系管......
  • springboot+vue学生公寓报修管理系统【程序+论文+开题】计算机毕业设计
    系统程序文件列表开题报告内容研究背景随着高校规模的不断扩大,学生公寓作为学生学习与生活的重要场所,其设施设备的维护与管理日益成为高校后勤服务的重要环节。传统的学生公寓报修方式往往依赖于纸质登记或口头报告,这种方式不仅效率低下,易导致信息丢失或延误处理,还难以对维......
  • springboot+vue诊所预约系统【程序+论文+开题】计算机毕业设计
    系统程序文件列表开题报告内容研究背景随着医疗服务的日益普及和民众健康意识的增强,传统诊所面临的就诊高峰、资源分配不均及患者等待时间长等问题日益凸显。特别是在大城市,优质医疗资源尤为紧张,患者往往需要提前数天甚至数周排队挂号,极大地影响了就医体验和医疗效率。在此......