实例:用C#.NET手把手教你做微信公众号开发(21)--使用微信支付线上收款:H5方式

2023-05-16

在做线上、线下销售时,可以使用微信便捷支付,通过微信公众号收款有很多种收款方式,如下图:

今天我们来讲一下H5场景支付,使用手机浏览器打开就是H5方式,最常见的推广是短信内置链接,这种场景需要调用微信app,然后再启动微信支付及后续流程。

一、操作演示

随便用什么能扫码的app扫码下面二维码,打开后复制链接到手机浏览器打开页面。

对CSDN的自动审核真的很无语,什么二维码都判定为违规图片,nnd,吐槽一下。

猿友们可以复制下面链接到手机浏览器后打开,即可体验支付全流程。

http://www.jjlm.ltd/weixinold/WeixinPayRecvH5Test.aspx

 

二、微信支付配置

在本系列文章第18篇((2条消息) 实例:用C#.NET手把手教你做微信公众号开发(18)--使用微信支付给粉丝发红包_乱世刀疤的博客-CSDN博客)有介绍过,除了基础配置之外,以下配置是关键:

三、H5场景支付演示源码

前端页面源码如下:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="H5Test.aspx.cs" Inherits="Jjlm.H5Test" %>

<!DOCTYPE html>
<html>
<head runat="server">
	<meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=no">
    <title>微信支付H5收款测试</title>
</head>

<style>
    img{
        width: 100%;
        display: block;
    }
    body{
        margin:0;padding:0;
        background-repeat: no-repeat;
        background-size: 100% 100%;
    }
    .line{
        display: flex;justify-content:space-between;height: 40px;margin: 0 20px;
    }
    .boline{
        border-bottom: 1px solid #ddd;
    }
    .ti{
        font-size: 18px;
        line-height: 40px;
    }
    .text{
        font-size: 16px;
        line-height: 40px;
    }
</style>

<body>
<div style="width: 100%;background:#555;color:#fff;font-size:20px;height: 40px;line-height: 40px;text-align: center;">
    收银台
</div>
<form id="form1" runat="server">
    <div>
        <div style="margin-top:10px;background: #fff;">
            <div class="line boline">
                <span class="ti">订单号:</span>
                <asp:Label runat="server" id="lbBillNo" Text="" Visible="true" class="text" />
            </div>
            <div class="line boline">
                <span class="ti">产品:</span>
                <asp:Label runat="server" id="lbProductName" Text="" Visible="true" class="text" />
            </div>
            <div class="line boline">
                <span class="ti">商品数量: </span>
                <asp:Label runat="server" id="lbProductNum" Text="" Visible="true" class="text" />
            </div>
            <div class="line">
                 <span class="ti">支付金额:</span>
                 <asp:Label runat="server" id="lbTotalFee" Text="" Visible="true" class="text" style="color: crimson;" />
            </div>
        </div>
		<div style="margin: 10px auto;">
			<img src="img/wxzf.jpg" alt="" style="width: 100%;">
        </div>
        <div style="margin: 10px auto;width: 90%;height: 40px;background: #20a91d;border-radius:10px;text-align: center;" runat="server" id="divBtn">
            <asp:Button ID="submit" runat="server" Text="立即支付"  Style="background: #20a91d;border-width:0px;color: #fff;line-height: 35px;font-size: 20px;outline:0px;-webkit-appearance: none;" OnClick="btnCallPayClick"/>
        </div>
        </br>
		
		<asp:Label runat="server" id="lbProductId" Text="" Visible="false" class="text" />
		<asp:Label runat="server" id="lbUrl" Text="" Visible="true" class="text" />

    </div>
</form>
</body>
</html>

后端源码如下:

using System;
using System.Web;
using System.Web.UI;
using System.Data;
using System.Data.SqlClient;
using QinMing.Config;
using QinMing.WeixinPayCollect;

namespace Jjlm
{
    
	public partial class H5Test : System.Web.UI.Page
    {
		public static string wxJsApiParam {get;set;} //H5调起JS API参数
		
        protected void Page_Load(object sender, EventArgs e)
        {
            lbProductId.Text = "202102040001";
			lbProductName.Text = "微信支付H5测试";
			lbBillNo.Text = DateTime.Now.ToString("yyyyMMddHHmmssms");   //
			lbProductNum.Text = "1";
			lbTotalFee.Text = "0.01";
        }
		
		protected void btnCallPayClick(object sender, EventArgs e)
        {
			string fee = (Convert.ToDouble(lbTotalFee.Text)*100).ToString(); ///微信单位分
			string out_trade_no = lbBillNo.Text;

            if (lbProductName.Text != null)
            {
                //若传递了相关参数,则调统一下单接口,获得后续相关接口的入口参数
                H5Pay h5Pay = new H5Pay();
				string scip = GetWebClientIp();//获取客户端真实IP
				string url = h5Pay.GetPayUrl(scip,fee,out_trade_no,lbProductId.Text,lbProductName.Text);
				lbUrl.Text = url;
				Response.Redirect(url, false);//跳转到微信支付中间页 
            }
            else
            {
                Log.showlog("zhifu_callpay","页面缺少参数,请返回重试");
            }
        }	
        
		
		public string GetWebClientIp()  
        {  
            string userIP = "";  
            try  
            {  
                if (System.Web.HttpContext.Current == null  
            || System.Web.HttpContext.Current.Request == null  
            || System.Web.HttpContext.Current.Request.ServerVariables == null)  
                    return "";  
                string CustomerIP = "";  
                //CDN加速后取到的IP simone 090805  
                CustomerIP = System.Web.HttpContext.Current.Request.Headers["Cdn-Src-Ip"];  
                if (!string.IsNullOrEmpty(CustomerIP))  
                {  
                    return CustomerIP;  
                }  
                CustomerIP = System.Web.HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];  
                if (!String.IsNullOrEmpty(CustomerIP))  
                {  
                    return CustomerIP;  
                }  
                if (System.Web.HttpContext.Current.Request.ServerVariables["HTTP_VIA"] != null)  
                {  
                    CustomerIP = System.Web.HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];  
                    if (CustomerIP == null)  
                        CustomerIP = System.Web.HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];  
                }  
                else  
                {  
                    CustomerIP = System.Web.HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];  
                }  
                if (string.Compare(CustomerIP, "unknown", true) == 0)  
                    return System.Web.HttpContext.Current.Request.UserHostAddress;  
                return CustomerIP;  
            }  
            catch { }  
            return userIP;  
        }
	
    }
}

四、收款类源码

上面演示代码中用到的类和上一篇文章是同一个,源码已在上一篇文章中给出。

且用于收款记录存放的表也在上一篇文章给出,只是有一个字段标注的支付来源不同。

五、收款后收款记录状态更新

同上一篇文章介绍的内容一致,代码不再重复贴出。

前端代码:WeixinPayRecvResultNotify.aspx

后端代码:WeixinPayRecvResultNotify.aspx.cs

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

实例:用C#.NET手把手教你做微信公众号开发(21)--使用微信支付线上收款:H5方式 的相关文章

  • F# 中灵活类型注释的用途是什么?

    我正在学习 F 我不明白灵活类型的目的 或者更好的是 我无法理解这样写的区别 set TextOfControl c Control s c Text lt s 并写下 set TextOfControl c T when T gt Con
  • 如何检测我的应用程序是否在虚拟机中运行?

    如何检测 NET 或 Win32 我的应用程序是否在虚拟机中运行 这就是我使用的 using var searcher new System Management ManagementObjectSearcher Select from W
  • 通过.NET/C#发送传真

    如何在 NET 中发送传真 我们有一个传真服务器 我们需要通过它将文件传真给客户 由于我们有传真服务器 我不认为我必须在我的机器上配置传真调制解调器 对吧 它只会通过传真服务器吗 有没有好的免费 或便宜 传真 API 在我的研究中 我遇到过
  • WPF 在 .NET Framework 4.0 中的 x64 上启动缓慢

    我注意到 如果我为任何 CPU x64 构建 WPF 应用程序 则与在 x86 上启动 在发布和调试模式下 相比 启动 大约 20 秒 或加载新控件所需的时间要长得多 VS 的内部或外部 即使是最简单的 WPF 应用程序也会出现这种情况 该
  • 编辑 sln、proj、suo 文件的最佳实践?

    在 NET 中 每个解决方案 项目都有 SUO SLN Proj 文件 虽然我知道这些文件是什么 但手动编辑它们是否明智 它们是否需要进行编辑 如果是这样 最好的方法是什么 Thanks 您可以编辑许多可用的文件 文档中甚至有相关说明htt
  • 在 ASP.Net 2008 或更高版本中创建复合和自定义网格控件[关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 请建议我如何创建复合网格 即 我需要 Framework 3 5 及更高版本中 gridview 的所有功能 但还需要在
  • 您可以在 Mac 上安装并运行基于 .NET 框架构建的应用程序吗?

    我需要在我的 Mac 上使用 继续开发使用 NET 开发的桌面应用程序 有适用于 Mac 的 NET Framework 4 0 吗 这是否允许在 Mac 上运行和开发基于 NET 的应用程序 我正在考虑的另一个选择是在 Mac 上使用 W
  • 将面板添加到 Datagridview

    我想将面板放入包含一组控件的列中 并将其放入 datagridview 中 我怎么能这么做呢 因为标准方法允许添加复选框 按钮 组合框等 但我找不到如何放置简单的面板 谢谢你的帮助 面板控件也继承自控件类 因此您可以像添加任何其他控件一样添
  • DotNetOpenId —“此消息已被处理”错误(第 2 部分)

    这已经被问过Here https stackoverflow com questions 727838 dotnetopenid this message has already been processed error 但不是我做的 OP
  • 在多线程场景中正确锁定 List

    好吧 我只是无法正确理解多线程场景 抱歉再次问类似的问题 我只是在互联网上看到许多不同的 事实 public static class MyClass private static List
  • CanExecute 何时被调用?

    在演示中 我有一个按钮可以切换布尔字段isAsking 我创建了一个命令 该命令仅在以下情况下执行isAsking true 一旦我按下切换按钮 okButton IsEnable立即更改 这表明该命令发现了更改isAsking 我感到很困
  • 从 .NET 应用程序登录 Windows

    我认为它应该是一个Windows服务 当给定某些条件时 它应该执行登录到机器的操作 机器将在 登录屏幕 中检查网络服务 以了解登录时应使用的用户名和密码 这可以吗 我不想要 自动登录 Windows 功能 Thanks AFAIK 无法完成
  • ASP.NET 5 未在开发模式下运行

    我已将 ASP NET 5 项目更新为 beta 8 现在我们应该使用以下 Web 命令 commands web Microsoft AspNet Server Kestrel 现在我已经使用环境变量更新了我的项目 这也更新了我的 lau
  • 指定自定义序列化程序时,错误详细信息未反序列化

    我正在使用自定义XmlObjectSerializer在我的应用程序中 为此 我替换XmlSerializerOperationBehavior with MyOperationBehavior看起来像这样 public class MyO
  • CLR 内部字符串常量吗?

    最近我一直在阅读字符串实习生池的工作原理 然而我一直没能找到这个问题的答案 如果我声明一个常量字符串变量 例如const string STR foo 这是否也会添加到实习生表中 只是为了澄清事情 CLR 不参与字符串驻留 Internin
  • 基于 .NET 4 构建的 MEF 应用程序是否可以导入针对 .NET 3.5 构建的类型?

    我正在使用托管扩展性框架开发一个主机应用程序 它是针对 NET 4 和框架中内置的 System ComponentModel Composition 程序集构建的 我希望支持使用 NET 3 5 开发部件并以声明方式导出它们的能力 由于导
  • 使用 MemoryCache 而不是普通的旧 Dictionary 的令人信服的理由是什么

    我刚刚遇到内存缓存 http msdn microsoft com en us library system runtime caching memorycache aspx这是 NET 4 中的新增功能 我知道如果你想的话它会很有用 限制
  • TPL架构问题

    我目前正在开展一个项目 我们面临并行处理项目的挑战 到目前为止没什么大不了的 现在来说说问题 我们有一个 ID 列表 我们定期 每 2 秒 为每个 ID 调用一个 StoredProcedure 需要单独检查每个项目的 2 秒 因为它们是在
  • 类型与创建 CLR 存储过程不匹配

    我在程序集中有一个如下所示的方法 namespace MyNameSpace public class MyClass Microsoft SqlServer Server SqlProcedure public static void M
  • EntLib5:登录应用程序块未记录到事件日志(例外:无法构造 LogWriter 类型)-任何人都可以帮忙吗?

    你好呀 我刚刚设置了 Enterprise Library 5 的日志记录应用程序块部分 我认为我已经完成了正确的操作 但它没有记录到事件日志 它在写入方法上出错并给出了以下异常 The type LogWriter cannot be c

随机推荐