微信支付官方文档:电商收付通(二级商户进件)开发指引-文档中心-微信支付服务商平台
1.安装SDK(SKIT.FlurlHttpClient.Wechat.TenpayV3)
2.前期准备
1)APPID:服务商在公众平台申请得应用appId.
2) mchid:服务商的收款账号
3) API V3 密钥:用于平台证书解密、回调信息解密
4)API 证书序列号
5)微信支付商户 API 证书私钥(通常为 `apiclient_key.pem` 文件内容)
6)证书内容(apiclient_cert.pem 的内容)
如图
3.写一个类,用来初始化SDK中的类(WechatTenpayClient)
internal class WXClients
{
static WXClients()
{
var certificateManager = new InMemoryCertificateManager();
WechatTenpayClientOptions options = new WechatTenpayClientOptions();
options.MerchantId = AppConfigurtaionHelper.Configuration["WXInfoSettings:MerchantId"];
options.MerchantV3Secret = AppConfigurtaionHelper.Configuration["WXInfoSettings:MerchantV3Secret"];
options.MerchantCertificateSerialNumber = AppConfigurtaionHelper.Configuration["WXInfoSettings:MerchantCertificateSerialNumber"];
options.MerchantCertificatePrivateKey = AppConfigurtaionHelper.Configuration["WXInfoSettings:MerchantCertificatePrivateKey"];
options.PlatformCertificateManager = certificateManager;
options.AutoEncryptRequestSensitiveProperty = true; //直接加密请求中敏感信息字段的扩展方法
Instance = new WechatTenpayClient(options);
}
//平台证书
internal static async Task InitializeCertificateManagerAsync()
{
var request = new QueryCertificatesRequest();
var response = await Instance.ExecuteQueryCertificatesAsync(request);
response = Instance.DecryptResponseSensitiveProperty(response);
foreach (var certificateModel in response.CertificateList)
{
Instance.PlatformCertificateManager.AddEntry(new CertificateEntry(certificateModel));
}
}
public static readonly WechatTenpayClient Instance;
}
4.调用(app支付列子)
CreatePayPartnerTransactionAppRequest request = new CreatePayPartnerTransactionAppRequest();
request.AppId = wXInfoSettings.SP_APPID;//服务商应用ID
request.MerchantId = wXInfoSettings.MerchantId;//服务商户号
request.SubMerchantId = merInfo.ShId;//二级商户号
// request.SubAppId = wXInfoSettings.SP_APPID;//二级商户应用ID
request.Description = model.Description;//商品描述
request.OutTradeNumber = tranInfo.TranscationId.ToString();//商户订单号
request.NotifyUrl = systemSettings.Url + wXInfoSettings.PaymentnotifyUrl; //systemSettings.Url + wXInfoSettings.PaymentnotifyUrl;//通知地址
//结算信息
CreatePayPartnerTransactionAppRequest.Types.Settlement settlement = new CreatePayPartnerTransactionAppRequest.Types.Settlement();
settlement.IsProfitSharing = model.YMoney > 0 ? true : false;//是否指定分账
if (settlement.IsProfitSharing.Value) {
settlement.SubsidyAmount = model.Subsidy_MoneyFen;//补差金额
}
request.Settlement = settlement;
//订单金额信息
request.Amount = new CreatePayPartnerTransactionAppRequest.Types.Amount()
{
Total =model.PayMoneyFen//订单总金额,单位为分。
};
//场景信息
request.Scene = new CreatePayPartnerTransactionAppRequest.Types.Scene()
{
ClientIp = model.Client_Ip // 用户终端IP
};
NLogHelper.Info("参数:" + JsonConvert.SerializeObject(request));
var res = await WXClients.Instance.ExecuteCreatePayPartnerTransactionAppAsync(request);
NLogHelper.Info("结果:" + JsonConvert.SerializeObject(res));
if (res.IsSuccessful()) //成功
{
var prepayId = res.PrepayId;
//调起支付
var data = WXClients.Instance.GenerateParametersForAppPayRequest(wXInfoSettings.SP_APPID, prepayId);
rm.Data = data;
rm.State = 200;
}
else //失败
{
}
5.支付成功之后接收
获取请求体
/// <summary>
/// 读取请求的json数据
/// </summary>
/// <returns></returns>
protected async Task<string> GetRequestJsonStr()
{
Request.ContentType = "application/json";
string content = string.Empty;
using (StreamReader sr = new StreamReader(Request.Body, Encoding.UTF8))
{
content = await sr.ReadToEndAsync();
}
return content;
}
获取请求头
var headers = Request.Headers;
public async Task<ReturnModel> OrdinaryPaymentNotice(string body, IHeaderDictionary header)
{
ReturnModel rm = new ReturnModel();
try
{
//验证签名
string timestamp = header["Wechatpay-Timestamp"].ToString();//Wechatpay-Timestamp 字段
string nonce = header["Wechatpay-Nonce"].ToString();// Wechatpay-Nonce 字段
string signature = header["Wechatpay-Signature"].ToString();//Wechatpay-Signature 字段
string serialNumber =header["Wechatpay-Serial"].ToString();//Wechatpay-Serial 字段
NLogHelper.Info($"验证签名:{timestamp} --- {nonce} ----{signature} ----{serialNumber}");
//获取证书,根据证书验签
await WXClients.InitializeCertificateManagerAsync();
var ret = WXClients.Instance.VerifyEventSignature(timestamp, nonce, body, signature, serialNumber, out Exception error);
if (!ret)
{
rm.Msg = "签名验证失败!" + error.Message;
return rm;
}
var callbackModel = WXClients.Instance.DeserializeEvent(body);
if ("TRANSACTION.SUCCESS".Equals(callbackModel.EventType))
{
/* 根据事件类型,解密得到支付通知敏感数据 */
var callbackResource = WXClients.Instance.DecryptEventResource<TransactionResource>(callbackModel);
NLogHelper.Info("解密参数:" + JsonConvert.SerializeObject(callbackResource));
var outTradeNumber = Convert.ToInt64( callbackResource.OutTradeNumber);//支付系统订单号
string transactionId = callbackResource.TransactionId; //微信支付订单号
rm.State = 200;
rm.Data = "成功";
}
}
catch (Exception ex)
{
rm.Msg = ex.Message;
}
return rm;
}