WeChatPayAppSdkRequest.cs 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. using System.Collections.Generic;
  2. using Essensoft.AspNetCore.Payment.Security;
  3. namespace Essensoft.AspNetCore.Payment.WeChatPay.V3.Request
  4. {
  5. /// <summary>
  6. /// APP支付 调起支付
  7. /// 最新更新时间:2020.09.29
  8. /// https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/pay/transactions/chapter3_8.shtml
  9. /// </summary>
  10. public class WeChatPayAppSdkRequest : IWeChatPaySdkRequest
  11. {
  12. /// <summary>
  13. /// 预支付交易会话ID
  14. /// 微信返回的支付交易会话id。
  15. /// 示例值: WX1217752501201407033233368018
  16. /// </summary>
  17. public string PrepayId { get; set; }
  18. /// <summary>
  19. /// 订单详情扩展字符串
  20. /// 暂填写固定值Sign=WXPay
  21. /// 示例值:Sign=WXPay
  22. /// </summary>
  23. public string Package { get; set; } = "Sign=WXPay";
  24. #region IWeChatPaySdkRequest Members
  25. public IDictionary<string, string> GetParameters()
  26. {
  27. var parameters = new WeChatPayDictionary
  28. {
  29. { "prepayid", PrepayId },
  30. { "package", Package }
  31. };
  32. return parameters;
  33. }
  34. public void PrimaryHandler(WeChatPayOptions options, WeChatPayDictionary sortedTxtParams)
  35. {
  36. if (!string.IsNullOrEmpty(options.SubAppId) && !string.IsNullOrEmpty(options.SubMchId))
  37. {
  38. sortedTxtParams.Add(WeChatPayConsts.appid, options.SubAppId);
  39. sortedTxtParams.Add(WeChatPayConsts.partnerid, options.SubMchId);
  40. }
  41. else
  42. {
  43. sortedTxtParams.Add(WeChatPayConsts.appid, options.AppId);
  44. sortedTxtParams.Add(WeChatPayConsts.partnerid, options.MchId);
  45. }
  46. sortedTxtParams.Add(WeChatPayConsts.noncestr, WeChatPayUtility.GenerateNonceStr());
  47. sortedTxtParams.Add(WeChatPayConsts.timestamp, WeChatPayUtility.GetTimeStamp());
  48. var signatureSourceData = BuildSignatureSourceData(sortedTxtParams);
  49. sortedTxtParams.Add(WeChatPayConsts.paySign, SHA256WithRSA.Sign(options.CertificateRSAPrivateKey, signatureSourceData));
  50. }
  51. private static string BuildSignatureSourceData(WeChatPayDictionary sortedTxtParams)
  52. {
  53. return $"{sortedTxtParams.GetValue(WeChatPayConsts.appid)}\n{sortedTxtParams.GetValue(WeChatPayConsts.timestamp)}\n{sortedTxtParams.GetValue(WeChatPayConsts.noncestr)}\n{sortedTxtParams.GetValue(WeChatPayConsts.prepayid)}\n";
  54. }
  55. #endregion
  56. }
  57. }