essensoft / paylink

一套基于 .NET 开发的支付SDK,它简化了API调用及通知的处理流程。
MIT License
1.76k stars 483 forks source link

V3版分账提示缺少平台证书序列号 #124

Closed wangjunjx8868 closed 2 years ago

wangjunjx8868 commented 2 years ago

V3版分账提示缺少平台证书序列号

roc916 commented 2 years ago

内部是有传平台证书序列号的 WeChatPayClient.cs#L164,建议下载源码断点调试

wangjunjx8868 commented 2 years ago

研究了半天也找到 敏感信息在哪传

roc916 commented 2 years ago

Receiver.cs#L46 按照文档给对应的BodyModel参数填明文就行了

wangjunjx8868 commented 2 years ago
 var fzmodel = new Receiver
            {
                Account = "111111",
                Type = "MERCHANT_ID",
                Name = "xxx有限公司",
                Amount=1
            };
            var request = new WeChatPayProfitSharingReceiversAddRequest();

            request.SetBodyModel(fzmodel);
            var pcm = new WeChatPayPlatformCertificateManager();
            WeChatPayOptions wcp = new WeChatPayOptions();
            wcp.APIv3Key = _optionsAccessor.Value.APIv3Key;
            wcp.AppId = _optionsAccessor.Value.AppId;
            wcp.AppSecret = _optionsAccessor.Value.AppSecret;
            wcp.RsaPublicKey = wxPublicSTR;
            wcp.MchId = _optionsAccessor.Value.MchId ;
            wcp.Certificate = _hostingEnvironment.WebRootPath + "/wechatpay.pem";
            await pcm.GetCertificateAsync(_client, wcp, "微信平台证书序列号");
            var response = await _client.ExecuteAsync(request, wcp);

不行啊报System.ArgumentNullException: Value cannot be null. (Parameter 'rsa')

roc916 commented 2 years ago

用 WeChatPayProfitSharingReceiversAddBodyModel ,另外 用 p12格式证书。

wangjunjx8868 commented 2 years ago

按照官方文档要加密的话用的是 微信支付平台证书中的公钥 。商家自己在后台生成是是p12格式,用接口获得 微信支付平台证书是pem格式,我换成 p12 提示 Certificate not found!

wangjunjx8868 commented 2 years ago
 public  string Encrypt3(string data, string publicKey)
        {
            if (string.IsNullOrEmpty(data))
            {
                throw new ArgumentNullException(nameof(data));
            }

            if (string.IsNullOrEmpty(publicKey))
            {
                throw new ArgumentNullException(nameof(publicKey));
            }

            using (var rsa = RSA.Create())
            {
                rsa.ImportRSAPublicKey(Convert.FromBase64String(publicKey), out var _);
                return Convert.ToBase64String(rsa.Encrypt(Encoding.UTF8.GetBytes(data), RSAEncryptionPadding.OaepSHA1));
            }
        }
        private void button1_Click(object sender, EventArgs e)
        {
            var sysdd = Encrypt3("你好", publicKey);
        }

用你源码中的RSA加密,然后用微信支付平台证书中的公钥 ,加密直接报错

roc916 commented 2 years ago

paylink中微信平台证书由WeChatPayPlatformCertificateManager自动管理,不需要你自己去调用。

image

roc916 commented 2 years ago

另外之前有个BUG,加密敏感信息会跳过 List ,最新分支已修复

roc916 commented 2 years ago

68b80110c8774f4381aabbcdcfffe57b81019eb8 也修正了 WeChatPayProfitSharingReceiversAddRequest 不加密的问题

wangjunjx8868 commented 2 years ago

另外之前有个BUG,加密敏感信息会跳过 List ,最新分支已修复

NUGET上我要更新一下吗?

roc916 commented 2 years ago

稍等吧 晚上会发个版本

roc916 commented 2 years ago

你先拉代码 调通

wangjunjx8868 commented 2 years ago

调通了,但是 有个小bug就是 不是支付还是分账 ,必须在ExecuteAsync前加上下面两句


  _optionsAccessor.Value.Certificate = _hostingEnvironment.WebRootPath + "/apiclient_cert.p12";
  _optionsAccessor.Value.CertificatePassword = _optionsAccessor.Value.MchId;
roc916 commented 2 years ago

你这么写 不如直接 new WeChatPayOptions

wangjunjx8868 commented 2 years ago

{"code":"PARAM_ERROR","message":"分账接收方关系不存在,请检查参数中每个接收方的关系。"} 出现这个错,应该在这个之前 先执行 “添加分账接收方”,执行完这个API,再进行分账,我觉得是这个流程。我试试看

wangjunjx8868 commented 2 years ago

可以用了,完工谢谢

roc916 commented 2 years ago

这个属于业务层面了,需要问微信支付了。

wangjunjx8868 commented 2 years ago

已解决