首页 > 其他分享 >Winform微信扫码支付

Winform微信扫码支付

时间:2023-08-26 16:14:26浏览次数:39  
标签:扫码 queryResult string 微信 static WeChetConfig public Winform

微信扫码支付引用的是第三方的:Senparc.Weixin

引用:

using Senparc.Weixin.MP.TenPayLibV3;

首先,在Form_Load 里面调用生成支付二维码的方法:

 /// <summary>
        /// Form_Load事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void FormWeChet_Load(object sender, EventArgs e)
        {
            //调用微信方法,生成支付二维码
            WeChatCode();
        }

然后写如何生成二维码的方法实现:

 /// <summary>
        /// 微信二维码生成
        /// </summary>
        public void WeChatCode()
        {
            string out_trade_no =System.DateTime.Now.ToString("yyyymmddhhmmss") + Code();//微信订单号要唯一,我这里只是写了一个时间+随机数
            var data = new Senparc.Weixin.MP.TenPayLibV3.TenPayV3UnifiedorderRequestData(WeChetConfig.AppId, WeChetConfig.MchId, WeChetConfig.Body, out_trade_no, WeChetConfig.TotalFee, WeChetConfig.SpbillCreateIp, WeChetConfig.NotifyUrl, Senparc.Weixin.MP.TenPayV3Type.NATIVE, WeChetConfig.OpenId, WeChetConfig.PayKey, TenPayV3Util.GetNoncestr());//这个类内容在最下面
            var response = TenPayV3.Unifiedorder(data);
 
            var QrCode_url = response.code_url;
            var qrdata = new QRCoder.QRCodeGenerator().CreateQrCode(QrCode_url, QRCoder.QRCodeGenerator.ECCLevel.H);
 
            var qrImg = new QRCoder.QRCode(qrdata).GetGraphic(256);
            this.pictureBox1.Image = qrImg;
 
            //定时查询支付状态
            var timer = new System.Windows.Forms.Timer();
            timer.Interval = 5000;//间隔5秒 
            timer.Tick += (sender2, e2) =>
            {
                var dataQueryOrder = new Senparc.Weixin.MP.TenPayLibV3.TenPayV3OrderQueryRequestData(WeChetConfig.AppId, WeChetConfig.MchId, null, TenPayV3Util.GetNoncestr(), WeChetConfig.OutTradeNo, WeChetConfig.PayKey);
                var queryResult = TenPayV3.OrderQuery(dataQueryOrder);
                if (queryResult.trade_state == "SUCCESS")//支付成功
                {
                   //这里写自己的数据库逻辑
                }
                else if (queryResult.trade_state == "CLOSED")//已关闭
                {
                    MessageBox.Show("该订单已关闭,请重新扫码支付");
                    WeChatCode();//重新调用生成方法
                    timer.Stop();
                    timer.Dispose();
                }
                else if (queryResult.trade_state == "PAYERROR")//支付失败(其他原因,如银行返回失败)
                {
                    CacelRequest(queryResult);
                }
            };
            timer.Start();
        }

写撤销支付的方法:

/// <summary>
        /// 撤销支付的订单
        /// </summary>
        /// <param name="out_trade_no"></param>
        public void CacelRequest(OrderQueryResult queryResult)
        {
            var data = new TenPayV3CloseOrderRequestData(queryResult.appid, queryResult.mch_id, queryResult.out_trade_no, WeChetConfig.PayKey, queryResult.nonce_str);
            var closeOrder = TenPayV3.CloseOrder(data);
 
            if (closeOrder.result_code == "FAIL")
            {
                MessageBox.Show("该订单撤销失败,请联系管理员");
                this.DialogResult = DialogResult.Cancel;
            }
            else
            {
                MessageBox.Show("该订单已撤销,请重新发起支付请求");
                this.DialogResult = DialogResult.Cancel;
 
            }
        }

微信订单号的随机数方法:

/// <summary>
        /// 微信订单单号的随机数方法
        /// </summary>
        /// <returns></returns>
        private string Code()
        {
            string RandomCode = "";
 
            for (int i = 0; i < 6; i++)
            {
                //获取随机数的方法
                Random rand = new Random();
 
                int RandKey = rand.Next(0, 10);
                RandomCode += RandKey.ToString();
            }
            return RandomCode;
        }

最后是所需要的类:

 public class WeChetConfig
    {
        private readonly static string appId;
        private readonly static string mchId;
        private readonly static string payKey;
        private readonly static string body;
        private readonly static string ipAddress;
        private readonly static string out_trade_no;
        private readonly static int totalfee;
        private readonly static string notifyurl;
 
        static WeChetConfig()
        {
            appId = “”;//这里写APPID
            mchId =  “”;//这里写商户ID
            payKey =  “”;//这里写PayKey
            body = "商品描述";
            totalfee = 1;
            notifyurl = "";
            string name = Dns.GetHostName();
            IPAddress[] ipadrlist = Dns.GetHostAddresses(name);
            foreach (IPAddress ipa in ipadrlist)
            {
                if (ipa.AddressFamily == AddressFamily.InterNetwork)
                {
                    ipAddress = ipa.ToString(); break;
                }
            }
        }
        public static string AppId => appId; //微信支付分配的公众账号ID(企业号corpid即为此appId)
        public static string MchId => mchId;//微信支付分配的商户号
        public static string Body => body; //商品描述
        public static string OutTradeNo => out_trade_no; //商户系统内部订单号,要求32个字符内,只能是数字、大小写字母_-|* 且在同一个商户号下唯一。
        public static int TotalFee => totalfee; //订单总金额,单位为分
        public static string SpbillCreateIp => ipAddress; //APP和网页支付提交用户端ip,Native支付填调用微信支付API的机器IP。
        public static string NotifyUrl => notifyurl;//异步接收微信支付结果通知的回调地址,通知url必须为外网可访问的url,不能携带参数。
        public static string OpenId = ""; //trade_type=JSAPI时(即公众号支付),此参数必传,此参数为微信用户在商户对应appid下的唯一标识。
        public static string PayKey => payKey;
    }

标签:扫码,queryResult,string,微信,static,WeChetConfig,public,Winform
From: https://www.cnblogs.com/mapstar/p/17658919.html

相关文章

  • 微信开发之一键邀请好友加入群聊的技术实现
    邀请群成员(开启群验证)若群开启邀请确认,仅能通过本接口邀请群成员请求URL:http://域名/addChatRoomMemberVerify请求方式:POST请求头Headers:Content-Type:application/jsonAuthorization:login接口返回参数:参数名必选类型说明wId是String登录实例标识chatRoomId是String群iduserList是nu......
  • 微信开发之一键修改群聊备注的技术实现
    修改群备注修改群名备注后,如看到群备注未更改,是手机缓存问题,可以连续点击进入其他群,在点击进入修改的群,再返回即可看到修改后的群备注名,群名称的备注仅自己可见请求URL:http://域名地址/modifyGroupRemark请求方式:POST请求头Headers:Content-Type:application/jsonAuthorization:login......
  • 微信开发之一键修改群聊备注的技术实现
    修改群备注 修改群名备注后,如看到群备注未更改,是手机缓存问题,可以连续点击进入其他群,在点击进入修改的群,再返回即可看到修改后的群备注名,群名称的备注仅自己可见请求URL:http://域名地址/modifyGroupRemark请求方式:POST请求头Headers:Content-Type:application/json......
  • 微信开发之一键创建微信群聊的技术实现
    创建微信群本接口为敏感接口,请查阅调用规范手册创建后,手机上不会显示该群,往该群主动发条消息显示。请求URL:http://域名地址/createChatroom请求方式:POST请求头Headers:Content-Type:application/jsonAuthorization:login接口返回参数:参数名必选类型说明wId是String登录实例标识userLis......
  • 实现windows客户端微信多开
    实现windows客户端微信多开1、右键点击微信图标——属性——目标,复制下来2、右键——新建txt文件3、打开txt文件——输入以下内容:@echooffstart"""C:\ProgramFiles(x86)\Tencent\WeChat\WeChat.exe"start"""C:\ProgramFiles(x86)\Tencent\WeChat\WeCha......
  • c# WinForm--微信Native支付
    c#WinForm--微信Native支付 一、了解Native支付流程我用的是模式二,模式二的流程如下二、如何将Demo用在我的WinForm里面打开Demo工程,复制里面的lib、third文件夹到我的工程下,添加引用,引用的内容就是third文件夹里的。还有Demo里面的business文件夹,里面的代码可以参考(复......
  • odoo16.0 企业微信解决方案
    需求背景企业微信作为当前企业内部沟通的几大内部IM软件之一,其优势在于能够跟微信打通,方便与客户联系。很多客户都有需求,要在企业微信内部对工作进行及时通知和反馈,在企业微信中进行审批,乃至统计员工的考勤和费用等等。本模块将展示,通过与odoo的关联,我们将如何利用企业微信提......
  • 微信小程序的渲染层与逻辑层
    1为什么小程序中的渲染层和逻辑层进行分离在之前的网页一般开发流程中,我们通常使用js操作DOM,以引起页面的一些变化响应用户的行为。varname2=document.getElementById("name")这样子当你的项目越来越大的时候代码会充斥着非常多的交互逻辑和程序的各种状态的变量,是比较混乱......
  • Jenkins +miniprogram-ci 构建 发布、预览微信小程序
           #!/bin/bash-lrm-rfqrcode*.jpgyarnyarnwxcitype=$actionappid=$appidversion=$versiondesc=$descbuildId=${BUILD_ID}#计算过期时间,并将过期时间写进自定义环境变量#计算过期时间,并将过期时间写进自定义环境变量now=`date'+%Y-%m-%d%H......
  • 微信开发之一键邀请好友加入群聊的技术实现
    邀请群成员(开启群验证)  若群开启邀请确认,仅能通过本接口邀请群成员请求URL:http://域名/addChatRoomMemberVerify请求方式:POST请求头Headers:Content-Type:application/jsonAuthorization:login接口返回参数:参数名必选类型说明wId是String登录实例标......