.NET微信扫码支付模式二API接口开发测试

C#对接微信支付V3 Native支付,用SKIT.FlurlHttpClient.Wechat.TenpayV3库5分钟搞定 本文详细介绍了如何使用C#和SKIT.FlurlHttpClient.Wechat.TenpayV3库快速集成微信支付V3 Native支付功能。从环境准备、配置商户信息到实现支付接口和处理支付结果通知,提供了完整的实战指南,帮助开发者在5分钟内完成支付功能集成。 阅读详情

.NET微信扫码支付模式二API接口开发测试

主要实现微信扫码支付,官网的SDKdemo 就不要使用 一直不能调试通过的,还是自己按照API接口文档一步一步来实现,吐槽下微信一点责任感都木有,能不能demo搞个正常的吗,不要坑惨了一大群码农们有点社会责任感吧 还是多学学你的Alibaba 直接上干货

具体文档接口都直接参考文档说明干

具体代码一步一步呈上

Index.aspx 显示二维码页面:

复制代码

<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
    <meta http-equiv="content-type" content="text/html;image/gif;charset=utf-8"/>
    <meta name="viewport" content="width=device-width, initial-scale=1" /> 
    <title>微信支付样例-扫码支付</title>
</head>
<body>
    
    <div style="margin-left: 10px;color:#00CD00;font-size:30px;font-weight: bolder;">扫码支付模式二</div><br/>
    <asp:Image ID="Image2" runat="server" style="width:200px;height:200px;"/>
    
</body>
 </html>

复制代码

复制代码

protected void Page_Load(object sender, EventArgs e)
    {
        //支付金额
        string PayPrice = Request.GetString("payprice").ToString("filtersql");
        //支付单号
        string Payorder = Request.GetString("payorder").ToString("filtersql");
        //公众号jsapi支付 H5支付传参数
        string Openid = Request.GetString("openid").ToString("filtersql");
        //扫码支付 模式二
        string productId = Request.GetString("productId").ToString("filtersql");
        
                 WechatPayHelper wxpay = new WechatPayHelper();
            
            int total_fee = (Convert.ToInt32(decimal.Parse("0.01") * 100)); 
                      //扫码支付模式二 Native   Pay  trade_type=NATIVE时(即扫码支付),此参数必传。此参数为二维码中包含的商品ID,商户自行定义
  主要参数依次是 订单号 金额 openid 公众号  产品productid
            string return_response = wxpay.GetUnifiedOrderResultNative("2017100882002", total_fee, "财政专费", "oC88888JeOjjkgvlWf6p999Jgu4", "456888888");
      //将url生成二维码图片

      Image2.ImageUrl = "http://localhost:1200/NotivePayAPI/MakeQRCode.aspx?data=" + HttpUtility.UrlEncode(return_response);

复制代码

 

复制代码

public class WechatPayHelper
{
    private string RequestUrl = "";

    private string key = "";
    private string appid = "";//应用ID
    private string mch_id = "";//商户号
    private string nonce_str = "";//随机字符串
    private string sign = "";//签名
   // private string body = "";//商品描述
   // private string out_trade_no = "";//商户订单号
    private string spbill_create_ip = "";//终端IP
    private string notify_url = "";//通知地址
    private string trade_type = "";//交易类型
    private string pay_url = "";
    //字符编码格式 目前支持 utf-8
    private string input_charset = "utf-8";
    //签名方式
    private string sign_type = "MD5";
    public WechatPayHelper()
    {
        HttpContext Context = System.Web.HttpContext.Current;
        DataTable dt = null;
        
        //native 扫码支付配置  读取配置文件XML
        string strXML = "Wechat_Pay_Native.xml";
        //////////////////////////////////////////////////
        object objValue = Common.DataCache.GetCache(strXML);
        if (objValue == null)
        {
            dt = GetConfigXml("//Config//PayConfig/" + strXML);
            Common.DataCache.SetCache(strXML, dt);
        }
        else
        {
            dt = (DataTable)objValue;
        }
        if (dt != null)
        {
            appid = dt.Rows[0]["appid"].ToString();
            mch_id = dt.Rows[0]["mch_id"].ToString();
            notify_url = dt.Rows[0]["notify_url"].ToString();
            pay_url = dt.Rows[0]["pay_url"].ToString();
            spbill_create_ip = GetUserIp();
            nonce_str=StrRodamNo(16);
            trade_type = dt.Rows[0]["trade_type"].ToString();
            key = dt.Rows[0]["key"].ToString();
        }
    }
   /// <summary>
    /// 生成直接支付url 调用统一下单,获得下单结果 扫码支付模式二   支付url有效期为2小时,
    /// </summary>
    /// <param name="out_trade_no"></param>
    /// <param name="total_fee"></param>
    /// <param name="body"></param>
    /// <returns></returns>
    public string GetUnifiedOrderResultNative(string out_trade_no, int total_fee, string body, string openid, string productId)
    {
        //请求业务参数详细
        StringBuilder sb = new StringBuilder();
        sb.AppendFormat("<xml><appid>{0}</appid><mch_id>{1}</mch_id> <body>{2}</body><nonce_str>{3}</nonce_str>", appid, mch_id, body, nonce_str);
        sb.AppendFormat("<out_trade_no>{0}</out_trade_no><total_fee>{1}</total_fee> <spbill_create_ip>{2}</spbill_create_ip><trade_type>{3}</trade_type>", out_trade_no, total_fee.ToString(), spbill_create_ip, trade_type);
        sb.AppendFormat("<notify_url>{0}</notify_url>", notify_url);
        sb.AppendFormat("<openid>{0}</openid>", openid);
        sb.AppendFormat("<product_id>{0}</product_id>", productId);

        //把请求参数打包成数组
        Dictionary<string, string> softdic = new Dictionary<string, string>();
        softdic.Add("appid", appid);
        softdic.Add("mch_id", mch_id);
        softdic.Add("nonce_str", nonce_str);
        softdic.Add("body", body);
        softdic.Add("out_trade_no", out_trade_no);
        softdic.Add("total_fee", total_fee.ToString());
        softdic.Add("spbill_create_ip", spbill_create_ip);
        softdic.Add("trade_type", trade_type);
        softdic.Add("notify_url", notify_url);
        softdic.Add("openid", openid);
        softdic.Add("product_id", productId);
        //请求参数体
        string strRequest = "";

        //加密签名
        string strSign = MakeSignData(softdic, ref strRequest);

        strRequest += "&sign=" + strSign;

        //打包xml
        sb.AppendFormat("<sign>{0}</sign></xml>", strSign);

        //发送请求
        string strResponse = RequestWechatpay(sb.ToString());


        //URLDECODE返回的信息
        Encoding code = Encoding.GetEncoding(input_charset);
        strResponse = HttpUtility.UrlDecode(strResponse, code);
        string ResponseURL = ReadXmlNode(strResponse);//获得统一下单接口返回的二维码链接code_url


        return ResponseURL;
    }

  /// <summary>
    /// 签名原始串
    /// </summary>
    /// <param name="dicParm">所有非空参数</param>
    /// <param name="strQueryString">请求串</param>
    /// <returns>签名串</returns>
    public string MakeSignData(Dictionary<string, string> dicParm, ref string strQueryString)
    {   //先排序
        Dictionary<string, string> dicSort = dicParm.OrderBy(o => o.Key).ToDictionary(o => o.Key, p => p.Value);
        StringBuilder sb = new StringBuilder();
        //再转换成URL字符串
        foreach (KeyValuePair<string, string> kvParm in dicSort)
        {
            if (null != kvParm.Value && "".CompareTo(kvParm.Value) != 0
                    && "sign".CompareTo(kvParm.Key) != 0 && "key".CompareTo(kvParm.Key) != 0 && "sign_type".CompareTo(kvParm.Key) != 0)
            {
                if (sb.Length > 0)
                {
                    sb.Append("&");
                    strQueryString += "&";
                }
                sb.Append(kvParm.Key + "=" + HttpUtility.UrlDecode(kvParm.Value));
                strQueryString += kvParm.Key + "=" + HttpUtility.UrlEncode(kvParm.Value);
            }
        }
        //再和key拼装成字符串
        sb.Append("&key=" + key);
        //再进行MD5加密转成大写
        return MD5Create(sb.ToString(), input_charset).ToUpper();

          }

    public static string MD5Create(string str, string charset)
    {
        string retStr;
        MD5CryptoServiceProvider m5 = new MD5CryptoServiceProvider();

        //创建md5对象
        byte[] inputBye;
        byte[] outputBye;

        //使用GB2312编码方式把字符串转化为字节数组.
        try
        {
            inputBye = Encoding.GetEncoding(charset).GetBytes(str);
        }
        catch (Exception ex)
        {
            inputBye = Encoding.GetEncoding("GB2312").GetBytes(str);
        }
        outputBye = m5.ComputeHash(inputBye);

        retStr = System.BitConverter.ToString(outputBye);
        retStr = retStr.Replace("-", "");
        return retStr;
    }

    /// <summary>
    ///把请求参数信息打包发送请求微信支付地址
    /// </summary>
    /// <param name="strRequestData">请求参数字符串(QueryString)</param>
    /// <returns></returns>
    private string RequestWechatpay(string strRequestData)
    {
        Encoding code = Encoding.GetEncoding(input_charset);

        //把数组转换成流中所需字节数组类型
        byte[] bytesRequestData = code.GetBytes(strRequestData);

        //请求远程HTTP
        string strResult = "";
        try
        {
            //设置HttpWebRequest基本信息
            HttpWebRequest myReq = (HttpWebRequest)HttpWebRequest.Create(pay_url);
            myReq.Method = "post";
            myReq.ContentType = "text/xml";

            //填充POST数据
            myReq.ContentLength = bytesRequestData.Length;
            Stream requestStream = myReq.GetRequestStream();
            requestStream.Write(bytesRequestData, 0, bytesRequestData.Length);
            requestStream.Close();

            //发送POST数据请求服务器
            HttpWebResponse HttpWResp = (HttpWebResponse)myReq.GetResponse();
            Stream myStream = HttpWResp.GetResponseStream();

            //获取服务器返回信息
            StreamReader reader = new StreamReader(myStream, code);
            StringBuilder responseData = new StringBuilder();
            String line;
            while ((line = reader.ReadLine()) != null)
            {
                responseData.Append(line);
            }

            //释放
            myStream.Close();

            strResult = responseData.ToString();
        }
        catch (Exception exp)
        {
            strResult = "报错:" + exp.Message;
        }

        return strResult;
    }


    /// <summary>
    /// 获得客户端的IP
    /// </summary>
    /// <returns>当前页面客户端的IP</returns>
    public static string GetUserIp()
    {

        string userHostAddress = HttpContext.Current.Request.UserHostAddress;

        if (string.IsNullOrEmpty(userHostAddress))
        {
            userHostAddress = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
        }

        //最后判断获取是否成功,并检查IP地址的格式(检查其格式非常重要)
        if (!string.IsNullOrEmpty(userHostAddress) && IsIP(userHostAddress))
        {
            return userHostAddress;
        }
        return "127.0.0.1";


    }

    /// <summary>
    /// 检查IP地址格式
    /// </summary>
    /// <param name="ip"></param>
    /// <returns></returns>
    public static bool IsIP(string ip)
    {
        return System.Text.RegularExpressions.Regex.IsMatch(ip, @"^((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)$");
    }


    /// <summary>
    /// 生成随机字母与数字
    /// </summary>
    /// <param name="IntStr">生成长度</param>
    /// <returns></returns>
    public static string StrRodamNo(int Length)
    {
        return StrRodam(Length, false);
    }

    /// <summary>
    /// 生成随机字母与数字
    /// </summary>
    /// <param name="Length">生成长度</param>
    /// <param name="Sleep">是否要在生成前将当前线程阻止以避免重复</param>
    /// <returns></returns>
    public static string StrRodam(int Length, bool Sleep)
    {
        if (Sleep)
            System.Threading.Thread.Sleep(3);
        char[] Pattern = new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' };
        string result = "";
        int n = Pattern.Length;
        System.Random random = new Random(~unchecked((int)DateTime.Now.Ticks));
        for (int i = 0; i < Length; i++)
        {
            int rnd = random.Next(0, n);
            result += Pattern[rnd];
        }
        return result;
    }

    #region 读取xml中的指定节点的值
    /// <summary>  
    /// 读取xml中的指定节点的值
    /// </summary>  
    private string ReadXmlNode(string filename)
    {
        string result = "调用微信服务异常";
        XmlDocument xmlDoc = new XmlDocument();
        try
        {
            xmlDoc.LoadXml(filename);
            
            XmlNode root = xmlDoc.SelectSingleNode("xml");       
            if (root != null)
                result = (root.SelectSingleNode("code_url")).InnerText;

        }
        catch (Exception e)
        {
           Common.Utils.WriteLogFile("ReadXmlNode:" + e.Message,"");
        }
        return result;
    }

    #endregion
}

复制代码

 MakeQRCode.aspx.cs   主要生成二维码 要引用 ThoughtWorks.QRCode.dll

复制代码

protected void Page_Load(object sender, EventArgs e)
    {
        if (!string.IsNullOrEmpty(Request.QueryString["data"]))
        {
            string str = Request.QueryString["data"];

            //初始化二维码生成工具
            QRCodeEncoder qrCodeEncoder = new QRCodeEncoder();
            qrCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE;
            qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.M;
            qrCodeEncoder.QRCodeVersion = 0;
            qrCodeEncoder.QRCodeScale = 4;

            //将字符串生成二维码图片
            Bitmap image = qrCodeEncoder.Encode(str, Encoding.Default);

            //保存为PNG到内存流  
            MemoryStream ms = new MemoryStream();
            image.Save(ms, ImageFormat.Png);

            //输出二维码图片
            Response.BinaryWrite(ms.GetBuffer());
            Response.End();
        }
    }

复制代码

 微信扫码支付异步通知结果处理

WXNativeNotifyPage.aspx.cs

复制代码

/// <summary>
    /// 微信扫码支付异步通知结果处理 主要负责接收微信支付后台发送过来的数据,对数据进行签名验证
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void Page_Load(object sender, EventArgs e)
    {
        ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
        //微信的API写法
        ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
        //接收从微信后台POST过来的数据
        //System.IO.Stream s = Page.Request.InputStream;
        //int count = 0;
        //byte[] buffer = new byte[1024];
        //StringBuilder builder = new StringBuilder();
        //while ((count = s.Read(buffer, 0, 1024)) > 0)
        //{
        //    builder.Append(Encoding.UTF8.GetString(buffer, 0, count));
        //}
        //s.Flush();
        //s.Close();
        //s.Dispose();
        //SZRPP.Common.Utils.WriteLogFile("接收post来的数据", "Receive data from WeChat : " + builder.ToString());
        //Dictionary<string, string> dicParam = GetInfoFromXml(builder.ToString());
        ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
        ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
        //接收从微信后台POST过来的数据
        StreamReader reader = new StreamReader(Request.InputStream);
        String xmlData = reader.ReadToEnd();
        Utils.WriteLog("接收post来的微信异步回调:" + xmlData, "微信异步回调");
        //序列化xml //转换数据格式并验证签名
        Dictionary<string, string> dicParam = GetInfoFromXml(xmlData);
        string data = "";

        try
        {
            //当收到通知进行处理时,首先检查对应业务数据的状态,判断该通知是否已经处理过,如果没有处理过再进行处理,如果处理过直接返回结果成功。在对业务数据进行状态检查和处理之前,要采用数据锁进行并发控制,以避免函数重入造成的数据混乱。
            if (dicParam.ContainsKey("return_code") && dicParam["return_code"] == "SUCCESS")
            {
                
                WechatPayHelper wcHelper = new WechatPayHelper();
                string strRequestData = "";
                //对返回的参数信息进行签名
                string strSign = wcHelper.MakeSignData(dicParam, ref strRequestData);
                //判断返回签名是否正确
                if (strSign == dicParam["sign"])
                {
                    //判断业务结果
                    if ("SUCCESS" == dicParam["result_code"])
                    {
                        //////检查openid和product_id是否返回
                        if (string.IsNullOrEmpty(dicParam["openid"]) || string.IsNullOrEmpty(dicParam["product_id"]))
                        {
                            data = "<xml><return_code><![CDATA[FAIL]]></return_code> <return_msg><![CDATA[产品ID不存在回调数据异常]]></return_msg></xml>";
                            Response.Write(data);
                        }

                        //判断业务是否处理过  应该有通知日志表  先暂通过缴费表做判断
                        string out_trade_no = dicParam["out_trade_no"];//订单编号
                        
                        if (out_trade_no != null)
                        {  //自己的订单逻辑处理了 比较金额是否一致
                            OrderPay pay = payBll.Query(out_trade_no,"");

                            if (pay!= null)
                            {
                                //商户系统对于支付结果通知的内容一定要做签名验证,并校验返回的订单金额是否与商户侧的订单金额一致,防止数据泄漏导致出现“假通知”,造成资金损失。
                                if (pay.PayPrice.Equals(decimal.Parse(dicParam["total_fee"])/100))
                                {
                                    data = "<xml><return_code><![CDATA[FAIL]]></return_code> <return_msg><![CDATA[金额不一致回调数据异常]]></return_msg></xml>";
                                    Response.Write(data);
                                }
                                if (pay.PayStatus == 1)
                                {
                                    //已经支付 视为处理过 直接返回
                                    data = "<xml><return_code><![CDATA[SUCCESS]]></return_code> <return_msg><![CDATA[OK]]></return_msg></xml>";
                                    Response.Write(data);
                                }
                                else
                                {  //收到确认后,更新订单的状态
                                    //修改支付状态
                                    if (payBll.UpdatePayStatus(out_trade_no, "1",1) > 0)
                                    {
                                       data = "<xml><return_code><![CDATA[SUCCESS]]></return_code> <return_msg><![CDATA[OK]]></return_msg></xml>";
                                        Response.Write(data);
                                    }
                                }
                            }
                            else
                            {
                                data = "<xml><return_code><![CDATA[FAIL]]></return_code> <return_msg><![CDATA[系统调用超时]]></return_msg></xml>";
                                Response.Write(data);
                            }
                        }
                    }
                    else
                    {
                        //错误信息
                        string error = dicParam["err_code"] + ":" + dicParam["err_code_des"];
                        data = "<xml><return_code><![CDATA[FAIL]]></return_code> <return_msg><![CDATA[系统调用超时]]></return_msg></xml>";
                        Response.Write(data);
                    }
                }
                else
                {
                    data="<xml><return_code><![CDATA[FAIL]]></return_code> <return_msg><![CDATA[系统超时]]></return_msg></xml>";
                    Response.Write(data);
                }
            }

        }
        catch (Exception ex)
        {
            Utils.WriteLog("微信异步回调异常:" + ex.Message, "异常日志");
            data = "<xml><return_code><![CDATA[FAIL]]></return_code> <return_msg><![CDATA[系统调用超时]]></return_msg></xml>";
            Response.Write(data);
        }
    }
    /// <summary>
    /// 把XML数据转换为Sorted<string, string>集合
    /// </summary>
    /// <param name="strxml"></param>
    /// <returns></returns>
    public Dictionary<string, string> GetInfoFromXml(string xmlstring)
    {
        Dictionary<string, string> sParams = new Dictionary<string, string>();
        try
        {
            XmlDocument doc = new XmlDocument();
            doc.LoadXml(xmlstring);
            XmlElement root = doc.DocumentElement;
            int len = root.ChildNodes.Count;
            for (int i = 0; i < len; i++)
            {
                string name = root.ChildNodes[i].Name;
                if (!sParams.ContainsKey(name))
                {
                    sParams.Add(name.Trim(), root.ChildNodes[i].InnerText.Trim());
                }
            }
        }
        catch (Exception ex)
        {
            
        }
        return sParams;
    }
  

复制代码

微信商户信息配置xml文件

Wechat_Pay_Native.xml

复制代码

<?xml version="1.0" encoding="utf-8" ?>
<data>
  <!--接收微信支付异步通知回调地址,通知url必须为直接可访问的url,不能携带参数-->
  <notify_url>http://8.20.7.8:300/PayNotifyPage/PayNotify/WXNativeNotifyPage.aspx</notify_url>
  <pay_url>https://api.mch.weixin.qq.com/pay/unifiedorder</pay_url>
  <!--微信开放平台审核通过的应用APPID-->
  <appid>wxf88888888888</appid>
  <!--微信支付分配的商户号-->
  <mch_id>14666666662</mch_id>
  <key>16gfhhg5655jjh55ff8ff88gd</key>
  <subject>财政专费</subject>
  <trade_type>NATIVE</trade_type>
</data>

复制代码

 至此就可以完成扫码支付了

 有图有真相

生成二维码显示

微信扫一扫 结果

Delphi/VB/PB/易语言桌面软件集成支付宝微信码支付实战指南 在现代软件工程中,HTTP API调用与数据安全传输是系统集成的核心技术。其基本原理是通过标准化的网络协议,实现不同应用间的数据交换与业务协同。在支付领域,这尤其关键,它确保了交易请求的可靠发起与状态的安全同步。对于桌面端软件开发而言,有效集成第三方支付API能极大提升软件的商业价值与用户体验,使其从单一的管理工具升级为集成交互闭环的解决方案。本文聚焦于一个经典的应用场景:为使用Delphi、VB、PowerBuilder、易语言等传统桌面开发工具构建的进销存、收银等系统,集成主流的移动支付功能。针对这些环 阅读详情

相关推荐

.NET ASP.NET 微信小程序调用jsapi支付形式完成支付功能

微信小程序支付

qq_43546591的博客 755

微信支付帮助类

1 using System; 2 using System.Collections.Generic; 3 using System.Web; 4 using System.Net; 5 using System.IO; 6 using System.Text; 7 using System.Configuration; 8 ...

andy20160821的博客 1369

ASP.NET MVC 微信码支付实践与完整源码

ASP.NET MVC是一个框架,用于构建Web应用程序,它遵循MVC(模型-视图-控制器)设计模式,确保了良好的分离关注点,使开发人员能够更有效地测试和维护代码。在ASP.NET MVC中,模型代表了数据和业务逻辑,视图是用户界面,控制器则处理用户输入和业务逻辑之间的交互。微信支付作为主流的移动支付解决方案之一,为商户提供了便捷的在线收款能力。集成微信支付API接口可允许开发者将其整合进自己的应用中,从而为用户提供无缝支付体验。

weixin_36444661的博客 775

.net html5 微信支付接口,解析微信支付的实现方法(.NET版)

前段时间做了网页版微信支付,遇到很多问题,不过最终还是解决了,现在在这里记录下开发流程以及说明,给其他人一些参考。一、准备工作首先肯定得先要开通微信支付功能,之前开通微信支付需要三万的押金的,现在不需要了,所以就做了这个功能。要进行微信支付开发,需要在公众号后台和微信商户后台进行相关的设置。1、开发目录配置微信支付需要在公众号后台(微信支付=开发配置)进行配置支付授权目录。这里授权目录需要是线上...

weixin_32459883的博客 1069

一小时搞定c#微信支付

微信jsapi支付 .net环境示例

yqsy123123的博客 1万+

多应用多平台支付模块-微信V2JsApi支付

此前,已设计过多应用多平模块的基础开篇。 本篇,准备对接微信V2JsApi支付基础模块,并基于此模块实现具体的业务功能逻辑。

m0_66949945的博客 874

.NET MVC结构框架下的微信码支付模式 API接口开发测试

 直接上干货 ,我们的宗旨就是为人民服务、授人以鱼不如授人以渔、不吹毛求疵、不浮夸、不虚伪、不忽悠、一切都是为了社会共同进步,繁荣昌盛,小程序猿、大程序猿、老程序猿还是嫩程序猿,希望这个社会不要太急功近利 ,希望每个IT行业的BOSS要有良知,程序猿的青春年华都是无私默默奉献,都是拿命拼出来了现在的成就,如果卸磨杀驴,如果逼良为娼,请MM你的良心对得起你爹妈吗,你也有家,你也有小孩,你也有父母的。...

weixin_34391445的博客 199

[微信支付]C# .net 微信码Native支付模式以及成功回调

0x0001 前言 经过一周的摧残,终于完成了微信支付,做完总结一下,觉得其实并不难,主要是网上没有一个明确的教程. 本文是基于C#语言上进行开发,其实本人是做java的,但由于最近接手维护的项目是C#的,所以也强制让自己简单的熟悉一遍C#(偷偷的说,我C# .net .asp都还没清楚,不过最重要的是思路,语言只是一种工具~~~) 0x0002 项目背景(可略过) 项目类型:在线考试系统;...

YuanMxy'Home 1万+

.NET Core 2.2下微信码支付全流程详解

微信支付作为中国最大的移动支付平台之一,为企业和个人提供了便捷的支付解决方案。其API接口是连接商家后台系统与微信支付系统的桥梁,通过这些接口开发者可以在自己的应用中实现微信支付功能。

weixin_36184718的博客 790

微信支付宝码支付简介

微信平台 支付模式 付款码支付 Native支付 JSAPI支付 APP支付 H5支付 小程序支付 各种模式的定义可以查看微信官方文档 这里应用Native支付,它是商户系统按微信支付协议生成支付维码,用户再用微信”完成支付的模式。 接入准备 申请参数 申请APPID 由于微信支付的产品体系全部搭载于微信的社交体系之上,所以直连商户或服务商商户接入微信支付之前,都需要有一个微信社交载体,该载体对应的ID即为APPID。该社交载体可以是公众号(什么是公众号),小程序(什么是小程序)或AP

小数点儿的博客 1611

[微信支付]C# .net 微信码支付Body含有中文导致出现“签名错误”

1.微信支付坑多多,签名Body竟出错 经过近期对微信支付的开发,走过太多的坑,真怕以后再做微信支付,特将小问题逐步整理. 此为微信支付中的native支付第种支付方式,在请求参数时出现问题:body(商品描述)为中文时,签名失败,为英文时签名成功。 系统为考试系统,测试报名考试是否能正常生成维码 测试1:考试名称为 wwwsdnh (全英文) [我将考试名称作为微信支付的body信息传入] ...

YuanMxy'Home 1887

ASP.NET Core 2.0 支付宝当面付之码支付

原文:ASP.NET Core 2.0 支付宝当面付之码支付 前言 自从微软更换了CEO以后,微软的战略方向有了相当大的变化,不再是那么封闭,开源了许多东西,拥抱开源社区,.NET实现跨平台,收购xamarin并免费提供给开发者等等。我本人是很喜欢.net的,并希望.net core能够崛起。我是从.net core 1.1的时候开始使用的,到现在的.n...

weixin_33709609的博客 206

asp.net mvc实现微信外H5支付方法

一、微信支付方式介绍 微信提供了各种支付方式,试用于各种不同的支付场景,主要有如下几种: 1、刷卡支付 刷卡支付是用户展示微信钱包内的“刷卡条码/维码”给商户系统描后直接完成支付的模式。主要应用线下面对面收银的场景。 2、码支付 码支付是商户系统按微信支付协议生成支付维码,用户再用微信”完成支付的模式。该模式适用于PC网站支付、实体店单品或订单支付、媒体广告支付等场

guandebaokwstu的博客 2735
上一篇: Linux下性能测试
July_lulu
博客等级 码龄9年 3粉丝 0原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值