c# .net framework 实现微信支付v3 h5支付 签名 验签

这篇具有很好参考价值的文章主要介绍了c# .net framework 实现微信支付v3 h5支付 签名 验签。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

接口文档:微信支付-开发者文档 (qq.com)



        public const string transactions_url = "https://api.mch.weixin.qq.com/v3/pay/transactions/h5";
        public static string certPath = AppDomain.CurrentDomain.BaseDirectory + @"\cert\apiclient_cert.p12";
        public static string certificatesPath = AppDomain.CurrentDomain.BaseDirectory + @"\cert\certificates_cert.pem"; // 回调解密证书 根据接口获取后 保存为 pem 后缀  我请求后自己手动保存的。没写代码去保存
        private static string certPassword = "888888888"; //.p12 的证书密码
        public string BuildAuth(string mchid, string serial_no, string method, string uri, string body)
        {
        var timestamp = DateTimeOffset.Now.ToUnixTimeSeconds();
        string nonce = Guid.NewGuid().ToString();
        //构造签名串
        //HTTP请求方法\n + URL\n + 请求时间戳\n + 请求随机串\n + 请求报文主体\n
        string message = method + "\n" + uri + "\n" + timestamp + "\n" + nonce + "\n" + body + "\n";
        string signature = GenerateSignature(message);

        //发起请求的商户(包括直连商户、服务商或渠道商)的商户号 mchid
        //商户API证书序列号serial_no,用于声明所使用的证书
        //请求随机串nonce_str
        //时间戳timestamp
        //签名值signature
        return "mchid=\"" + mchid + "\",nonce_str=\"" + nonce + "\",timestamp=\"" + timestamp + "\",serial_no=\"" + serial_no + "\",signature=\"" + signature + "\"";
        }


        /// <summary>
        /// 生成签名
        /// </summary>
        /// <param name="message"></param>
        /// <returns></returns>
        public static string GenerateSignature(string message)
        {
        X509Certificate2 cert = new X509Certificate2(certPath, certPassword, X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.Exportable);
        RSA PrivateKey = cert.GetRSAPrivateKey();
        byte[] dataBytes = Encoding.UTF8.GetBytes(message);
        byte[] signatureBytes = PrivateKey.SignData(dataBytes, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);
        return Convert.ToBase64String(signatureBytes);
        }


        /// <summary>
        /// 验证回调签名
        /// </summary>
        /// <param name="signature"></param>
        /// <param name="timestamp"></param>
        /// <param name="nonce"></param>
        /// <param name="body"></param>
        /// <returns></returns>
        public static bool VerifySignature(string signature, string timestamp, string nonce, string body)
        {
        //应答时间戳\n
        //应答随机串\n
        //应答报文主体\n
        X509Certificate2 wechatCert = new X509Certificate2(certificatesPath); //, X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.Exportable
        string combinedString = string.Format("{0}\n{1}\n{2}\n", timestamp, nonce, body);
        byte[] buff = Encoding.UTF8.GetBytes(combinedString);
        var rsaPar = wechatCert.GetRSAPublicKey().ExportParameters(false);
        var rsa = new RSACryptoServiceProvider();
        rsa.ImportParameters(rsaPar);
        return rsa.VerifyData(buff, CryptoConfig.MapNameToOID("SHA256"), Convert.FromBase64String(signature));
        }


        #region 加密解密

        public static string AesGcmDecrypt(string associatedData, string nonce, string ciphertext, string apikey)
        {
        GcmBlockCipher gcmBlockCipher = new GcmBlockCipher(new AesEngine());
        AeadParameters aeadParameters = new AeadParameters(
        new KeyParameter(Encoding.UTF8.GetBytes(apikey)),
        128,
        Encoding.UTF8.GetBytes(nonce),
        Encoding.UTF8.GetBytes(associatedData));
        gcmBlockCipher.Init(false, aeadParameters);

        byte[] data = Convert.FromBase64String(ciphertext);
        byte[] plaintext = new byte[gcmBlockCipher.GetOutputSize(data.Length)];
        int length = gcmBlockCipher.ProcessBytes(data, 0, data.Length, plaintext, 0);
        gcmBlockCipher.DoFinal(plaintext, length);
        return Encoding.UTF8.GetString(plaintext);
        }
        #endregion
        
        

  遇到的问题有

  1、签名老验证不过去

  c# .net framework 实现微信支付v3 h5支付 签名 验签
  生成的签名老验证不过    \n 不要加转义符

  2、 发送的请求老是400  使用工具请求正常。代码不行。
  UserAgent = "m.cnblogs.com/WebRequest"; 
  不要留空就行 网址可填自己的。

  3、回调解密的证书是自己获取的。可以获取后自己保存为后缀 .pem的证书文件
   获取平台证书列表-文档中心-微信支付商户平台 (qq.com)

  4、请求到h5_url 后可以在后面拼接指定跳转链接  https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb?prepay_id=wx2916263004719461949c84457c735b0000&package=2150917749&redirect_url=System.Web.HttpUtility.UrlEncode("https://www.cnblogs.com/MIMU86")

  5、苹果手机不是默认浏览器会跳到默认浏览器 无解文章来源地址https://www.toymoban.com/news/detail-747793.html

到了这里,关于c# .net framework 实现微信支付v3 h5支付 签名 验签的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java实现微信小程序V3支付

    2024年02月12日
    浏览(61)
  • springboot实现微信小程序V3微信支付功能

    appId:小程序appid appSecret:小程序的secret mchId:商户号 keyPath:商户私钥路径(apiclient_key.pem) certPath:证书路径(apiclient_cert.pem) platFormPath:平台证书(cert.pem) 注 : 需要通过写程序生成平台证书(见v3Get()方法) apiKey3:apiv3密钥 serialnumber:商户证书序列号 notifyUrl:回调地

    2024年02月12日
    浏览(61)
  • PHP实现小程序微信支付(v3版本)

    PS:本篇文章是PHP对小程序进行微信支付v3版本的实现,仅用于对支付流程的了解,具体使用方面需要大家自行调整 小程序端JS代码: PHP类的相关代码:

    2024年02月12日
    浏览(53)
  • springboot整合IJPay实现微信支付-V3---微信小程序

    微信支付适用于许多场合,如小程序、网页支付、但微信支付相对于其他支付方式略显麻烦,我们使用IJpay框架进行整合 JPay 让支付触手可及, 封装了微信支付、支付宝支付、银联支付常用的支付方式以及各种常用的接口。不依赖任何第三方 mvc 框架,仅仅作为工具使用简单

    2024年02月02日
    浏览(70)
  • Java实现微信小程序V3支付 (完整demo)

    2024年02月07日
    浏览(40)
  • PHP实现对微信支付v3版本回调数据的解密

    PS:本文使用了微信官方给出的demo来实现对回调数据的解密,本文主要对微信官方给出的demo如何使用作出部分个人讲解,以及对解密前后数据的格式进行展示 PHP类:这是微信官方给出的demo

    2024年02月15日
    浏览(48)
  • vue实现H5支付(微信,支付宝)

    1.判断浏览器是微信还是支付宝或其他浏览器 2.微信浏览器调用微信支付的方法(调用后台接口创建订单,需要微信用户唯一标识openid;接口返回微信支付所需的支付参数) 3.支付宝浏览器支付方法

    2024年02月16日
    浏览(45)
  • 前端H5微信支付宝支付实现

    支付宝的 首先是一个支付类型选择页面,在选择支付宝支付后,跳转到一个空白页,用于支付宝支付的中转页面。 在点击立即支付之后,直接跳转至自行设置好的空白页就好,并把你生成订单所需要的数据一并带过去。 接下来就是重点操作了(其实非常简单),在跳转这个

    2024年02月03日
    浏览(48)
  • 微信H5页面实现微信小程序支付

    背景: 在微信H5页面已经实现了微信JSAPI的网页支付,老板要求把整个业务线快速转移到微信小程序中,作为懒惰的程序员来说,直接把页面嵌套到小程序不就行了。说干就干,在小程序中设置好基本信息后,一预览居然成功了,一切看来是那么顺利,可到了系统的支付环节

    2024年02月14日
    浏览(53)
  • 前端实现微信支付(H5,微信小程序)

    通常一些电商项目使用到微信支付操作,所以简单地介绍一下微信支付的具体流程。 微信支付是微信内置微信浏览器(其他浏览器不支持)或者微信小程序的支付接口,主要负责用户对商家执行支付操作的流程。 例如常见的电商在下单环节,就需要通过使用微信支付接口,

    2024年02月08日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包