using CommonUtil;
using CommonUtil.Web;
using Essensoft.Paylink.WeChatPay;
using Essensoft.Paylink.WeChatPay.V3;
using Essensoft.Paylink.WeChatPay.V3.Domain;
using Essensoft.Paylink.WeChatPay.V3.Notify;
using Essensoft.Paylink.WeChatPay.V3.Request;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Options;
using Operater.DAL;
using Operater.DbModel;
using Operater.DTO.Sms;
using Operater.Service;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
namespace Api.Operater.Controllers.sms
{
[Route(TopConstants.SMSAPI_ROUTE)]
[Route(TopConstants.API_ROUTE, Order = 2)]
public class WxBackController : BaseController
{
public static string AppId = "wx7a9a40880081340d";
public static string Secret = "0570a64c9b7622a66d647689e55aab4d";
public static string MchId = "1652582679";
public static string APIv3Key = "42DjmxsL34sHwqiereE23KnS62Slk82W";
public static string Certificate = "D://勿删//apiclient_cert.p12";
private readonly IWeChatPayClient _client;
private readonly IWeChatPayNotifyClient _notifyClient;
public WxBackController(IWeChatPayClient client, IWeChatPayNotifyClient notifyclient)
{
_client = client;
_notifyClient = notifyclient;
}
///
/// 获取微信openid
///
///
///
[HttpPost]
public IActionResult GetOpenId([FromBody] GetOpenIdRequest request)
{
//return Success("ocUrg6nVVPhn-m6yNPg7igYnB64g");
LogUtil.Info($"授权用code:{request.Code}", "wxLog");
string getUrl = $"https://api.weixin.qq.com/sns/oauth2/access_token?appid={AppId}&secret={Secret}&code={request.Code}&grant_type=authorization_code";
string resStr = new WebUtil().DoGet(getUrl, null);
LogUtil.Info($"[获取openid]返回:{resStr}", "接口请求日志");
GzhGetOauth2TokenResponse response = JSONUtil.JsonToObject(resStr);
return Success(response.openid);
}
///
/// 获取支付信息
///
///
///
public async Task GetCreatePayInfo([FromBody] GetCreatePayInfoRequest request)
{
//获取充值包信息
var packageInfo = new SmsPackageDAL().GetById(request.PackageId);
if (packageInfo.IsNull())
{
return Error("充值包不存在!");
}
int totalAmount = decimal.ToInt32((decimal)packageInfo.Rechargeamount * 100);
long TradeId = TopUtil.GetId();
WxpayTrade wxpayTrade = new WxpayTrade()
{
Id = TradeId,
Openid = request.OpenId,
Amount = totalAmount,
CreateTime = DateTime.Now,
HasBack = 0,
SmsCount = (int)packageInfo.Rechargecount
};
var model = new WeChatPayTransactionsJsApiBodyModel
{
AppId = AppId,
MchId = MchId,
Amount = new Amount { Total = totalAmount, Currency = "CNY" },
Description = $"短信充值{packageInfo.Rechargecount}条短信-共{packageInfo.Rechargeamount}元",
NotifyUrl = "https://smsapi.ushopvip.com/smsapi/WxBack/WxPayBack",
OutTradeNo = TradeId.ToString(),
Payer = new PayerInfo { OpenId = request.OpenId }
};
var payRequest = new WeChatPayTransactionsJsApiRequest();
payRequest.SetBodyModel(model);
WeChatPayOptions weChatPayOptions = GetPayOptions();
var response = await _client.ExecuteAsync(payRequest, weChatPayOptions);
if (response.IsError)
{
return Error(response.Message);
}
wxpayTrade.PrepayId = response.PrepayId;
//记录库
bool re = new WxpayTradeDAL().Insert(wxpayTrade);
if (!re)
{
return Error("系统异常,请联系客服!");
}
var req = new WeChatPayJsApiSdkRequest
{
Package = "prepay_id=" + response.PrepayId
};
var parameter = await _client.ExecuteAsync(req, weChatPayOptions);
// 将参数(parameter)给 公众号前端
// https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_1_4.shtml
return Success(parameter);
}
///
/// 微信支付回调
///
///
///
public async Task WxPayBack()
{
try
{
WeChatPayOptions weChatPayOptions = GetPayOptions();
var notify = await _notifyClient.ExecuteAsync(HttpContext.Request, weChatPayOptions);
if (notify.TradeState == WeChatPayTradeState.Success)
{//支付成功
LogUtil.Info(JSONUtil.ObjectToJson(notify), "结果解密");
//处理支付结果
//用户信息查询
var preTrade = new WxpayTradeDAL().GetById(notify.OutTradeNo);
if (preTrade.IsNull())
{//预支付订单不存在
LogUtil.Info("预支付订单不存在:" + JSONUtil.ObjectToJson(notify), "支付结果失败");
return WeChatPayNotifyResult.Success;
}
preTrade.BackTime = DateTime.Now;
preTrade.HasBack = 1;
preTrade.TransactionId = notify.TransactionId;
preTrade.TradeType = notify.TradeType;
preTrade.TradeState = notify.TradeState;
preTrade.TradeStateDesc = notify.TradeStateDesc;
if (!notify.SuccessTime.IsNullOrEmpty())
{
preTrade.SuccessTime = Convert.ToDateTime(notify.SuccessTime);
}
new WxpayTradeDAL().Update(preTrade, null, null);
//充值处理
PayUserInfo(notify, preTrade);
return WeChatPayNotifyResult.Success;
}
return WeChatPayNotifyResult.Failure;
}
catch (WeChatPayException ex)
{
LogUtil.Info("ERROR:" + ex.ToString(), "结果解密");
return WeChatPayNotifyResult.Failure;
}
}
private void PayUserInfo(WeChatPayTransactionsNotify notify, WxpayTrade wxTrade)
{
var member_where_expression = Expressionable.Create().And(m => m.Openid == notify.Payer.OpenId).And(m => m.Isblack == 0).ToExpression();
var memberinfo = new SmsMemberDAL().GetSingle(member_where_expression);
string id = string.Empty;
if (memberinfo == null || string.IsNullOrEmpty(memberinfo.Id))
{
SmsMember smsMember = new SmsMember
{
Id = Guid.NewGuid().ToString(),
Registertime = DateTime.Now,
Openid = notify.Payer.OpenId,
Smscount = wxTrade.SmsCount,
Longintime = DateTime.Now
};
bool issuccess_member = new SmsMemberDAL().Insert(smsMember);
if (!issuccess_member)
{
LogUtil.Info("注册失败:" + JSONUtil.ObjectToJson(notify), "支付结果失败");
}
}
else
{
id = memberinfo.Id;
SmsMember smsMember = new SmsMember
{
Smscount = wxTrade.SmsCount + memberinfo.Smscount
};
int successcount = new SmsMemberDAL().Update(smsMember, m => new { m.Smscount }, s => s.Id == memberinfo.Id);
if (successcount == 0)
{
LogUtil.Info("充值失败:" + JSONUtil.ObjectToJson(notify), "支付结果失败");
}
}
//新增充值记录
decimal amount = Math.Round(decimal.Parse(wxTrade.Amount.ToString()) / 100, 2);
SmsRecord smsRecord = new SmsRecord
{
Id = Guid.NewGuid().ToString(),
Createtime = DateTime.Now,
Rechargecount = wxTrade.SmsCount,
Tid = notify.TransactionId,
Rechargeamount = amount,
Stype = 0,
Memberid = id,
Openid = notify.Payer.OpenId
};
bool issuccess = new SmsRecordDAL().Insert(smsRecord);
if (!issuccess)
{
LogUtil.Info("充值记录新增失败:" + JSONUtil.ObjectToJson(notify), "支付结果失败");
}
}
public static WeChatPayOptions GetPayOptions()
{
WeChatPayOptions weChatPayOptions = new WeChatPayOptions()
{
AppId = AppId,
MchId = MchId,
APIv3Key = APIv3Key,
Certificate = Certificate
};
return weChatPayOptions;
}
}
}