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("成功付款"); } }