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


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

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

    一、操作演示

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

     

     

     

     

    二、微信支付配置

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

    三、H5场景支付演示源码

    前端页面源码如下:

    1. <%@ Page Language="C#" AutoEventWireup="true" CodeFile="H5Test.aspx.cs" Inherits="Jjlm.H5Test" %>
    2. <!DOCTYPE html>
    3. <html>
    4. <head runat="server">
    5. <meta charset="utf-8">
    6. <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=no">
    7. <title>微信支付H5收款测试</title>
    8. </head>
    9. <style>
    10. img{
    11. width: 100%;
    12. display: block;
    13. }
    14. body{
    15. margin:0;padding:0;
    16. background-repeat: no-repeat;
    17. background-size: 100% 100%;
    18. }
    19. .line{
    20. display: flex;justify-content:space-between;height: 40px;margin: 0 20px;
    21. }
    22. .boline{
    23. border-bottom: 1px solid #ddd;
    24. }
    25. .ti{
    26. font-size: 18px;
    27. line-height: 40px;
    28. }
    29. .text{
    30. font-size: 16px;
    31. line-height: 40px;
    32. }
    33. </style>
    34. <body>
    35. <div style="width: 100%;background:#555;color:#fff;font-size:20px;height: 40px;line-height: 40px;text-align: center;">
    36. 收银台
    37. </div>
    38. <form id="form1" runat="server">
    39. <div>
    40. <div style="margin-top:10px;background: #fff;">
    41. <div class="line boline">
    42. <span class="ti">订单号:</span>
    43. <asp:Label runat="server" id="lbBillNo" Text="" Visible="true" class="text" />
    44. </div>
    45. <div class="line boline">
    46. <span class="ti">产品:</span>
    47. <asp:Label runat="server" id="lbProductName" Text="" Visible="true" class="text" />
    48. </div>
    49. <div class="line boline">
    50. <span class="ti">商品数量: </span>
    51. <asp:Label runat="server" id="lbProductNum" Text="" Visible="true" class="text" />
    52. </div>
    53. <div class="line">
    54. <span class="ti">支付金额:</span>
    55. <asp:Label runat="server" id="lbTotalFee" Text="" Visible="true" class="text" style="color: crimson;" />
    56. </div>
    57. </div>
    58. <div style="margin: 10px auto;">
    59. <img src="img/wxzf.jpg" alt="" style="width: 100%;">
    60. </div>
    61. <div style="margin: 10px auto;width: 90%;height: 40px;background: #20a91d;border-radius:10px;text-align: center;" runat="server" id="divBtn">
    62. <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"/>
    63. </div>
    64. </br>
    65. <asp:Label runat="server" id="lbProductId" Text="" Visible="false" class="text" />
    66. <asp:Label runat="server" id="lbUrl" Text="" Visible="true" class="text" />
    67. </div>
    68. </form>
    69. </body>
    70. </html>

    后端源码如下:

    1. using System;
    2. using System.Web;
    3. using System.Web.UI;
    4. using System.Data;
    5. using System.Data.SqlClient;
    6. using QinMing.Config;
    7. using QinMing.WeixinPayCollect;
    8. namespace Jjlm
    9. {
    10. public partial class H5Test : System.Web.UI.Page
    11. {
    12. public static string wxJsApiParam {get;set;} //H5调起JS API参数
    13. protected void Page_Load(object sender, EventArgs e)
    14. {
    15. lbProductId.Text = "202102040001";
    16. lbProductName.Text = "微信支付H5测试";
    17. lbBillNo.Text = DateTime.Now.ToString("yyyyMMddHHmmssms"); //
    18. lbProductNum.Text = "1";
    19. lbTotalFee.Text = "0.01";
    20. }
    21. protected void btnCallPayClick(object sender, EventArgs e)
    22. {
    23. string fee = (Convert.ToDouble(lbTotalFee.Text)*100).ToString(); ///微信单位分
    24. string out_trade_no = lbBillNo.Text;
    25. if (lbProductName.Text != null)
    26. {
    27. //若传递了相关参数,则调统一下单接口,获得后续相关接口的入口参数
    28. H5Pay h5Pay = new H5Pay();
    29. string scip = GetWebClientIp();//获取客户端真实IP
    30. string url = h5Pay.GetPayUrl(scip,fee,out_trade_no,lbProductId.Text,lbProductName.Text);
    31. lbUrl.Text = url;
    32. Response.Redirect(url, false);//跳转到微信支付中间页
    33. }
    34. else
    35. {
    36. Log.showlog("zhifu_callpay","页面缺少参数,请返回重试");
    37. }
    38. }
    39. public string GetWebClientIp()
    40. {
    41. string userIP = "";
    42. try
    43. {
    44. if (System.Web.HttpContext.Current == null
    45. || System.Web.HttpContext.Current.Request == null
    46. || System.Web.HttpContext.Current.Request.ServerVariables == null)
    47. return "";
    48. string CustomerIP = "";
    49. //CDN加速后取到的IP simone 090805
    50. CustomerIP = System.Web.HttpContext.Current.Request.Headers["Cdn-Src-Ip"];
    51. if (!string.IsNullOrEmpty(CustomerIP))
    52. {
    53. return CustomerIP;
    54. }
    55. CustomerIP = System.Web.HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
    56. if (!String.IsNullOrEmpty(CustomerIP))
    57. {
    58. return CustomerIP;
    59. }
    60. if (System.Web.HttpContext.Current.Request.ServerVariables["HTTP_VIA"] != null)
    61. {
    62. CustomerIP = System.Web.HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
    63. if (CustomerIP == null)
    64. CustomerIP = System.Web.HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
    65. }
    66. else
    67. {
    68. CustomerIP = System.Web.HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
    69. }
    70. if (string.Compare(CustomerIP, "unknown", true) == 0)
    71. return System.Web.HttpContext.Current.Request.UserHostAddress;
    72. return CustomerIP;
    73. }
    74. catch { }
    75. return userIP;
    76. }
    77. }
    78. }

    四、收款类源码

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

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

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

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

    前端代码:WeixinPayRecvResultNotify.aspx

    后端代码:WeixinPayRecvResultNotify.aspx.cs

  • 相关阅读:
    申请国外博士后的常识
    Linux内核知识点---线程与锁
    c++ 沉思录笔记——句柄(第一部分)
    解决尚医通com.aliyun.oss 和com.aliyun 爆红
    独角数卡安装前后常见问题汇总
    xf86-video-intel源码分析6 —— intel_device.c和intel_driver.h(1)
    K8s部署
    python安全工具开发笔记(五)——python数据库编程
    遥感云计算的一个拐点
    前端框架 React中Typecript的使用
  • 原文地址:https://blog.csdn.net/daobaqin/article/details/125414690