首页 > 编程语言 >c# WinForm--微信Native支付

c# WinForm--微信Native支付

时间:2023-08-26 10:55:27浏览次数:42  
标签:code c# 微信 -- 二维码 ToString result url data

c# WinForm--微信Native支付

 

一、了解Native支付流程

我用的是模式二,模式二的流程如下

二、如何将Demo用在我的WinForm里面

打开Demo工程,复制里面的lib 、third文件夹到我的工程下,添加引用,引用的内容就是third文件夹里的。还有Demo里面的business文件夹,里面的代码可以参考(复制)哦。说明:打开lib文件夹,看到DemoConfig.cs了吗,在这个文件里写入我们的商户号,appid,密钥,以及url,这几个必填项,这个DemoConfg类重写了IConfig,后面设计到appid等的地方,都可以通过函数自动读取,就不需要每次都填写啦。

三、生成订单

首先要下个单,主要想要的是下单之后返回的url,这样我们才能生成需要的二维码让人家给钱嘛,下单api,自己去官网看啦,必填的都要填上,不是必填的你就看着填把。
接下去这段代码就是下单,并获取url的函数

public string GetPayUrl(string tradeid)
        {          
            string url="";
            WxPayData data = new WxPayData();
            data.SetValue("body", textBox_Name.Text);//商品描述
            data.SetValue("attach", "test");//附加数据
            data.SetValue("out_trade_no", tradeid);
            data.SetValue("total_fee", int.Parse(textBox_money.Text));//总金额
            data.SetValue("time_start", DateTime.Now.ToString("yyyyMMddHHmmss"));//交易起始时间
            data.SetValue("time_expire", DateTime.Now.AddMinutes(10).ToString("yyyyMMddHHmmss"));//交易结束时间
            data.SetValue("goods_tag", "jjj");//商品标记
            data.SetValue("trade_type", "NATIVE");//交易类型
            data.SetValue("product_id", "111");//商品ID

            WxPayData result = WxPayApi.UnifiedOrder(data);//调用统一下单接口
            MessageBox.Show(result.GetValue("return_code").ToString()+result.GetValue("return_msg").ToString());
            if (result.GetValue("err_code_des") != null)
                MessageBox.Show(result.GetValue("err_code_des").ToString());
            if(result.GetValue("code_url")!=null)
                  url = result.GetValue("code_url").ToString();//获得统一下单接口返回的二维码链接

            Log.Info(this.GetType().ToString(), "Get native pay mode 2 url : " + url);
            return url;
        }

四、生成二维码

目前网上生成二维码的方法有好几种,本文将介绍【QRCoder】生成二维码的方式,生成二维码还有个免费组件叫Free Spire.Barcode,很好用
http://e-iceblue.cn/spirebarcode/create-qr-code-in-c.html

1、首先通过VS中的【NUGET】下载并引用QRCoder.dll

使用VS打开项目,项目->右键->管理Nuget程序包,然后选择联机,在输入框中输入QRCoder,如下图所示:

2、编写生成二维码代码,并返回至页面

   1、WebFrom (项目框架)

   2、功能场景:客户端浏览器使用jQuery.ajax 请求服务端返回二维码,服务端通过一般处理程序Handler.ashx 处理客户端请求并返回二维码至客户端

// 生成二维码的内容
string strCode = "http://www.walys.com";
QRCodeGenerator qrGenerator = new QRCoder.QRCodeGenerator();
QRCodeData qrCodeData = qrGenerator.CreateQrCode(strCode, QRCodeGenerator.ECCLevel.Q);
QRCode qrcode = new QRCode(qrCodeData);

// qrcode.GetGraphic 方法可参考最下发“补充说明”
Bitmap qrCodeImage = qrcode.GetGraphic(5,Color.Black,Color.White,null,15,6,false); 
MemoryStream ms = new MemoryStream();
qrCodeImage.Save(ms, ImageFormat.Jpeg);

// 如果想保存图片 可使用  qrCodeImage.Save(filePath);
// 响应类型
context.Response.ContentType = "image/Jpeg";
//输出字符流
context.Response.BinaryWrite(ms.ToArray());

以上为QRCoder生成二维码的核心代码

补充说明:QRCode.GetGraphic方法参数说明 

Bitmap qrCodeImage = qrcode.GetGraphic(5,Color.Black,Color.White,null,15,6,false); 
/* GetGraphic方法参数说明
                 public Bitmap GetGraphic(int pixelsPerModule, Color darkColor, Color lightColor, Bitmap icon = null, int iconSizePercent = 15, int iconBorderWidth = 6, bool drawQuietZones = true)
             * 
                 int pixelsPerModule:生成二维码图片的像素大小 ,我这里设置的是5 
             * 
                 Color darkColor:暗色   一般设置为Color.Black 黑色
             * 
                 Color lightColor:亮色   一般设置为Color.White  白色
             * 
                 Bitmap icon :二维码 水印图标 例如:Bitmap icon = new Bitmap(context.Server.MapPath("~/images/zs.png")); 默认为NULL ,加上这个二维码中间会显示一个图标
             * 
                 int iconSizePercent: 水印图标的大小比例 ,可根据自己的喜好设置 
             * 
                 int iconBorderWidth: 水印图标的边框
             * 
                 bool drawQuietZones:静止区,位于二维码某一边的空白边界,用来阻止读者获取与正在浏览的二维码无关的信息 即是否绘画二维码的空白边框区域 默认为true
   */

五、接着是查询结果

虽然说官方文档说要异步通知,但是我目前不知道我的窗体程序如何接受来自微信的消息,也不知道怎么回复收到的消息,用的是轮询,来获取支付结果,这里可以知道结果,但是也有个问题,就是微信方没有收到来自我的答复,就会一直发送结果。。。。。目前还无法解决,后面在了解一下。
以下是查询,开了个新线程。

private void Query()
        {
            Thread thread = new Thread(LoopQuery);
            thread.IsBackground = true;
            thread.Start();
        }

        private void LoopQuery(object msg)
        {
            int i = 0;
            WxPayData Querydata = new WxPayData();
            Querydata.SetValue("out_trade_no", textBox_id.Text);
            for (i = 0; i < 3; i++)
            {
                Thread.Sleep(5000);              //每隔5s查询一次
                WxPayData result = WxPayApi.OrderQuery(Querydata, 6);
                MessageBox.Show(result.ToString());
                var code = result.GetValue("return_code").ToString();
                MessageBox.Show(code + result.GetValue("return_msg").ToString());
                if (code == "SUCCESS")
                {
                    var state = result.GetValue("trade_state").ToString();
                    MessageBox.Show(state);
                    if (state == "SUCCESS")
                        break;
                }              
            }
            if (i >= 3)
                MessageBox.Show("还未成功付款哦");
            else
            {
                MessageBox.Show("成功付款");               
            }          
        }

 

标签:code,c#,微信,--,二维码,ToString,result,url,data
From: https://www.cnblogs.com/mapstar/p/17658481.html

相关文章

  • Python:过滤包含关键字的行
    PythonPandas:根据指定的关键字,过滤(提取)包含该关键字的行,并保存为Excel文件。importpandasaspdimportnumpyasnpinFile=r'D:\教学任务列表(理论课).xlsx'outFile=r'D:\教学任务(统计).xlsx'df1=pd.read_excel(inFile,header=1)type(df1)df1.head()df1.col......
  • Git的基本操作
    1.获取Git仓库的两种方式①将尚未进行版本控制的本地目录转换为Git仓库②从其它服务器克隆一个已存在的Git仓库以上两种方式都能够在自己的电脑上得到一个可用的Git仓库 2.在现有目录中初始化仓库如果自己有一个尚未进行版本控制的项目目录,想要用Git来控制......
  • 关于git的一些基础知识记录
    一.配置用户信息安装完Git之后,要做的第一件事就是设置自己的用户名和邮件地址。因为通过Git对项目进行版本管理的时候,Git需要使用这些基本信息,来记录是谁对项目进行了操作1.空白处鼠标右键,选择GitBashHere输入以下命令:  2.Git的全局配置文件通过gitconfig......
  • python应用耗时分析
    Linuxtimecommandhttps://linuxize.com/post/linux-time-command/粗略分析整个程序的耗时情况。 timewgethttps://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.19.9.tar.xzWhatwillbeprintedasanoutputdependsontheversionofthetimecommandyou’reu......
  • 大屏读取本地文件-js读取csv文件之FileReader
    <script>functionreadCsv(){constfile=document.getElementById('uploadFile').files[0];if(file.type!="text/csv"){alert("文件类型错误");return;}varreader=newFileReade......
  • 端到端自动驾驶
    https://github.com/OpenDriveLab/End-to-end-Autonomous-Drivinghttps://github.com/Pranav-chib/End-to-End-Autonomous-Driving......
  • 【8月摸鱼计划】GUI
    GUI(图形用户界面)一种全屏幕图形界面,用户通过点击设备(例如鼠标)操纵图形的屏幕元素。基本信息中文名称图形用户界面外文名称GraphicalUserInterface折叠编辑本段概述图形用户界面是一种人与计算机通信的界面显示格式,允许用户使用鼠标等输入设备操纵屏幕上的图标或菜单选项,以选......
  • 面试类-Java编程(二)
    18.说一下你对Java内存模型(JMM)的理解?Java内存模型(JavaMemoryModel,JMM),是一种抽象的模型,被定义出来屏蔽各种硬件和操作系统的内存访问差异。JMM定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存(MainMemory)中,每个线程都有一个私有的本地内存(LocalMemory),本地内......
  • 【Sword系列】第七届全国残疾人职业技能大赛样题-网络安全-古典密码
    (文章目录)前言古典密码是指使用传统的替换或移位方式对明文进行加密,例如凯撒密码、栅栏密码等。在这种加密方式中,加密密钥通常是公开的,因此易被破解。现代密码学基本上已经放弃了古典密码的加密方式,而采用更加高级的数学算法来保证加密的安全性。ASCII是一种字符编码标准,它规......
  • Redis安装说明
    Redis安装说明大多数企业都是基于Linux服务器来部署项目,而且Redis官方也没有提供Windows版本的安装包。因此课程中我们会基于Linux系统来安装Redis.此处选择的Linux版本为CentOS7.Redis的官方网站地址:https://redis.io/1.单机安装Redis1.1.安装Redis依赖Redis是基于C语言编......