C# MVC 微信支付教程系列之公众号支付代码

下面是对“C# MVC 微信支付教程系列之公众号支付代码”的完整攻略,包括安装微信支付SDK、生成订单、调用微信支付API等步骤。

安装微信支付SDK

在进行微信支付开发之前,需要下载并安装微信支付SDK,推荐使用官方提供的.NET版SDK。在官方网站(https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1)中点击下载.NET版本,并解压缩。

将解压缩后的文件拷贝到开发的根目录中,然后导入以下两个命名空间:

using WxPayAPI;
using System.Web;

生成订单

在生成订单时,需要在开发者自己的网站上生成和维护订单信息。订单中应该包含以下信息:

  • 交易金额
  • 货币类型
  • 订单标题
  • 订单详情
  • 唯一订单号
  • 用户IP

唯一订单号可以使用 GUID 进行生成,用户 IP 可以通过 HttpRequest 的 RemoteAddr 属性获取。交易金额等信息需要根据实际业务情况进行修改。

下面是一个简单的订单生成的示例,生成的订单信息将存到 HttpContext 的 Session 中。

public ActionResult CreateOrder()
{
    // 获取订单参数
    string body = "test";
    string attach = "test";
    string out_trade_no = Guid.NewGuid().ToString("N");
    int total_fee = 1;
    string trade_type = "JSAPI";

    // 获取用户 openid
    string openid = GetOpenid();
    if (string.IsNullOrEmpty(openid))
    {
        return Content("用户 openid 获取失败!");
    }

    // 组装订单信息
    WxPayData data = new WxPayData();
    data.SetValue("body", body);
    data.SetValue("attach", attach);
    data.SetValue("out_trade_no", out_trade_no);
    data.SetValue("total_fee", total_fee);
    data.SetValue("openid", openid);
    data.SetValue("trade_type", trade_type);
    data.SetValue("spbill_create_ip", Request.UserHostAddress);

    // 发起统一下单API请求
    WxPayData result = WxPayApi.UnifiedOrder(data);
    if (result.GetValue("return_code").ToString().ToUpper() != "SUCCESS")
    {
        return Content(result.GetValue("return_msg").ToString());
    }

    // 保存订单信息到 Session 中
    HttpContext.Session["order"] = result;

    return RedirectToAction("Pay");
}

调用微信支付API

在调用微信支付API时,需要发送请求到微信支付后台,得到返回的结果。

首先需要将订单信息进行签名,签名方法如下:

public static string Sign(WxPayData data, string key)
{
    // 根据参数名按字典序排序
    IDictionary<string, string> dict = new SortedDictionary<string, string>();
    foreach (string key in data.GetKeys())
    {
        dict.Add(key, data.GetValue(key).ToString());
    }

    // 拼接成字符串
    string str = "";
    foreach (KeyValuePair<string, string> item in dict)
    {
        if (item.Value != "")
        {
            str += item.Key + "=" + item.Value + "&";
        }
    }
    str += "key=" + key;

    // 计算签名
    string sign = MD5Util.GetMD5(str).ToUpper();
    return sign;
}

然后需要将签名后的订单信息一同传递给微信支付后台,并解析返回的结果。

public ActionResult Pay()
{
    WxPayData order = (WxPayData)HttpContext.Session["order"];

    // 生成支付信息
    WxPayData data = new WxPayData();
    data.SetValue("appId", order.GetValue("appid"));
    data.SetValue("timeStamp", WXPayUtil.GetTimestamp().ToString());
    data.SetValue("nonceStr", WXPayUtil.GetNonceStr());
    data.SetValue("package", "prepay_id=" + order.GetValue("prepay_id"));
    data.SetValue("signType", "MD5");

    // 签名
    string sign = Sign(data, WxPayConfig.KEY);
    data.SetValue("paySign", sign);

    // 保存支付信息到 ViewBag
    ViewBag.PayInfo = data;

    return View();
}

以上就是生成订单和调用微信支付API的完整流程。实际开发中可能还需要进行其他的参数设置和订单信息校验等步骤,具体可以参考微信支付官方文档和SDK源码。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C# MVC 微信支付教程系列之公众号支付代码 - Python技术站

(0)
上一篇 2023年6月10日
下一篇 2023年6月10日

相关文章

  • CSS(Cascading Style Sheet)级联样式表常用术语总结

    CSS级联样式表常用术语总结 1. 术语概述 CSS: Cascading Style Sheet(层叠样式表),用来控制网页的样式。 选择器: 用来选择文档中需要应用样式的元素,如类选择器、ID选择器、通配符选择器等。 属性: 用来描述元素的特征,如颜色、大小、边距等。 声明: 由选择器和属性构成,用来定义样式。 优先级: 表示样式的重要程度,如!impo…

    css 2023年6月9日
    00
  • CSS3+Js实现响应式导航条

    下面是详细讲解 CSS3+Js 实现响应式导航条的完整攻略。 什么是响应式导航条? 响应式导航条是指适应不同屏幕尺寸的导航条,可以在不同设备上实现优雅的展示。例如,在宽屏显示器上,导航条可以展示为一排按钮;在移动设备上,为了节省空间,导航条可以通过菜单按钮下拉显示子菜单。 实现响应式导航条的必要条件 使用 HTML 标签搭建导航条的结构。 使用 CSS 样式…

    css 2023年6月10日
    00
  • php+ajax制作无刷新留言板

    让我来详细讲解一下PHP+Aajx制作无刷新留言板的完整攻略。 1. 确定需求 在开始之前,我们需要先确定需求,以便清晰地了解要实现哪些功能。通常,一个简单的留言板需要的功能包括: 用户可以在留言板上发布留言,留言包括标题和内容; 用户可以查看已发布的留言列表,每个留言包括标题、内容和发布时间。 接下来,我们将实现这两个功能。 2. 设计数据库 在开始编写代…

    css 2023年6月10日
    00
  • 使用 CSS Paint API 动态创建与分辨率无关的可变背景效果

    使用 CSS Paint API 可以动态创建与分辨率无关的可变背景效果。步骤如下: 第一步:安装 CSS Paint Api 支持 CSS Paint API 是一个比较新的标准,目前只有部分浏览器支持,需要在 CSS 中通过 -webkit-paint 或 -moz-paint 属性来标明。具体地,在 CSS 中添加 -webkit-paint 标明支持…

    css 2023年6月9日
    00
  • 发挥火狐浏览器的广告拦截威力(图文教程)

    发挥火狐浏览器的广告拦截威力(图文教程) 广告拦截器是现代浏览器中常见的功能,能够帮助用户过滤广告和恶意网站,提高网页浏览的速度和安全性。本文将针对使用火狐浏览器的用户,介绍如何发挥火狐浏览器的广告拦截威力。 步骤一:启用火狐浏览器的广告拦截器功能 打开火狐浏览器,点击右上角的菜单按钮(三个横线)。 在下拉菜单中选择“选项(Options)”。 在弹出的“选…

    css 2023年6月11日
    00
  • 浅谈Vue3 Composition API如何替换Vue Mixins

    实现Vue3 Composition API替换Vue Mixins的攻略如下: 1. 什么是Vue Mixins? Vue Mixins是Vue.js框架提供的一种代码复用机制,它允许你在多个组件之间共享代码。Mixins通过在组件中定义一些公共行为和方法,然后将它们注入到组件中,使得这些组件可以复用这些公共行为。 2. 何时替换Vue Mixins? 尽…

    css 2023年6月10日
    00
  • Css3制作变形与动画效果

    我来为您讲解一下 “Css3制作变形与动画效果” 的完整攻略。 1. 引言 Css3具有丰富的样式属性,可以制作出各种变形及动画效果,让页面更生动、更具吸引力。接下来,我将带领您学习如何实现Css3制作变形与动画效果。 2. 变形效果 2.1 旋转 使用 transform 属性可以实现元素旋转的效果。例如: .box { transform: rotate…

    css 2023年6月10日
    00
  • 限制div高度当内容多了溢出时显示滚动条

    当div容器内的内容过多时,我们通常希望其不会影响到其他元素的布局并且滚动后依然可以完整的显示所有内容。下面是一个简单的使用CSS实现div内部内容溢出时显示滚动条的方法。 方法一:通过设置 height 和 overflow 属性 我们可以通过设置height属性以及overflow属性实现div内部内容溢出时显示滚动条。具体的操作是: 将div容器添加一…

    css 2023年6月10日
    00
合作推广
合作推广
分享本页
返回顶部