.NET微信扫码支付接入(模式二-NATIVE)

一、前言

经过两三天的琢磨总算完成了微信扫码支付功能,不得不感叹几句:

微信提供的DEMO不错,直接复制粘贴就可以跑起来了;
微信的配置平台我真是服了。公众平台、商户平台、开放平台,一个平台一套账户密码,大写的恶心
       DEMO地址:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=11_1

.NET版DEMO中的Lib文件夹是关键,直接复制到自己的代码里,或者打成dll随个人意愿。

二、正文

Step1:肯定是产生商户订单号,然后传给微信后台,由微信去组成二维码字符串,然后返给你,你再把字符串做成图片;

 /// <summary>
 /// 获取二维码
 /// </summary>
 /// <param name="orderNumber"></param>
 /// <returns></returns>
 public string GetCodeUrl(string orderNumber)
 {
  var result = string.Empty;
  if (!string.IsNullOrEmpty(orderNumber))
  {
  var matchedItem = db.OrderInfoForProducts.FirstOrDefault(x => x.OrderNumber == orderNumber);
  if (matchedItem != null && matchedItem.IsPaid == false)
  {
   WxPayData data = new WxPayData();
   data.SetValue("body", "productBody");//商品描述
   data.SetValue("attach", "attach data");//附加数据
   data.SetValue("out_trade_no", WxPayApi.GenerateOutTradeNo());//随机字符串
   data.SetValue("total_fee", price);//总金额
   data.SetValue("time_start", DateTime.Now.ToString("yyyyMMddHHmmss"));//交易起始时间
   data.SetValue("time_expire", DateTime.Now.AddMinutes(10).ToString("yyyyMMddHHmmss"));//交易结束时间
   data.SetValue("goods_tag", "tag");//商品标记
   data.SetValue("trade_type", "NATIVE");//交易类型
   data.SetValue("product_id", WxPayApi.GenerateOutTradeNo());//商品ID
   result = WxPayApi.UnifiedOrder(data).GetValue("code_url").ToString();//调用统一下单接口
  }
  }
  return result;
 }

在这里,我是把公司的商户订单号放在了attach字段上,因为公司的商户订单号比较长,超过了32位。out_trade_no与product_id字段最多32位,请慎重!

微信中的价格不能带小数,所以0.01元要写成100。

Step2: 成功返回二维码字符串之后就可以在生成图片了,我这边使用了ThoughtWorks.QRCode.dll来生成图片:

 /// <summary>
 /// 根据字符串得到相应的二维码
 /// </summary>
 /// <param name="qrInfo"></param>
 /// <param name="productName"></param>
 /// <param name="version"></param>
 /// <returns></returns>
 public static Image CreateQRCodeImage(string qrInfo, string productName, string version)
 {
  try
  {
  if (!string.IsNullOrEmpty(qrInfo))
  {
   QRCodeEncoder encoder = new QRCodeEncoder
   {
   QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE,
   QRCodeScale = 4,
   QRCodeVersion = 0,
   QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.M
   };
   //编码方式(注意:BYTE能支持中文,ALPHA_NUMERIC扫描出来的都是数字)
   //大小(值越大生成的二维码图片像素越高)
   //版本(注意:设置为0主要是防止编码的字符串太长时发生错误)
   //错误效验、错误更正(有4个等级)

   Image image = encoder.Encode(qrInfo, Encoding.GetEncoding("utf-8"));
   string filename = $"{productName}_{version}.png";
   var userLocalPath = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
   var docPath = Path.Combine(userLocalPath, @"Your Product\QRCode");
   if (!Directory.Exists(docPath))
   {
   Directory.CreateDirectory(docPath);
   }
   string filepath = Path.Combine(docPath, filename);
   using (FileStream fs = new FileStream(filepath, FileMode.OpenOrCreate, FileAccess.Write))
   {
   image.Save(fs, System.Drawing.Imaging.ImageFormat.Png);
   fs.Close();
   image.Dispose();
   }
   return image;
  }
  }
  catch (Exception)
  {
  return null;
  }
  return null;
 }

Step3: 当用户扫完二维码之后,微信会发起回调,这时候我们就可以处理自己的业务逻辑了。这里我的UpdatePayStatus返回的是一个空页面

 /// <summary>
 /// 回调函数
 /// </summary>
 public ActionResult UpdatePayStatus()
 {
  //接收从微信后台POST过来的数据
  System.IO.Stream s = Request.InputStream;
  int count = 0;
  byte[] buffer = new byte[1024];
  StringBuilder builder = new StringBuilder();
  while ((count = s.Read(buffer, 0, 1024)) > 0)
  {
  builder.Append(Encoding.UTF8.GetString(buffer, 0, count));
  }
  s.Flush();
  s.Close();
  s.Dispose();

  //转换数据格式并验证签名
  WxPayData data = new WxPayData();
  try
  {
  data.FromXml(builder.ToString());
  }
  catch (WxPayException ex)
  {
  //若签名错误,则立即返回结果给微信支付后台
  WxPayData res = new WxPayData();
  res.SetValue("return_code", "FAIL");
  res.SetValue("return_msg", ex.Message);

  LogEntity signErrorLog = new LogEntity();
  signErrorLog.errorMessage = ex.Message;
  LogHelper.WriteLog(signErrorLog, null);

  Response.Write(res.ToXml());
  Response.End();
  }

  ProcessNotify(data);
  return View();
 }

 /// <summary>
 /// 处理回调数据
 /// </summary>
 /// <param name="data"></param>
 public void ProcessNotify(WxPayData data)
 {
  WxPayData notifyData = data;
  //检查支付结果中transaction_id是否存在
  if (!notifyData.IsSet("transaction_id"))
  {
  //若transaction_id不存在,则立即返回结果给微信支付后台
  WxPayData res = new WxPayData();
  res.SetValue("return_code", "FAIL");
  res.SetValue("return_msg", "支付结果中微信订单号不存在");

  LogEntity orderLog = new LogEntity();
  orderLog.errorMessage = "支付结果中微信订单号不存在";
  LogHelper.WriteLog(orderLog, null);

  Response.Write(res.ToXml());
  Response.End();
  }

  string transaction_id = notifyData.GetValue("transaction_id").ToString();

  //查询订单,判断订单真实性
  if (!QueryOrder(transaction_id))
  {
  //若订单查询失败,则立即返回结果给微信支付后台
  WxPayData res = new WxPayData();
  res.SetValue("return_code", "FAIL");
  res.SetValue("return_msg", "订单查询失败");

  LogEntity orderqueryLog = new LogEntity();
  orderqueryLog.errorMessage = "订单查询失败";
  LogHelper.WriteLog(orderqueryLog, null);

  Response.Write(res.ToXml());
  Response.End();
  }
  //查询订单成功
  else
  {
  WxPayData res = new WxPayData();
  res.SetValue("return_code", "SUCCESS");
  res.SetValue("return_msg", "OK");

  SetPaymentResult(data); //这里的参数是 data !!! 不是 res !!!

  Response.Write(res.ToXml());
  Response.End();
  }
 }

 /// <summary>
 /// 商户后台更新
 /// </summary>
 /// <param name="res"></param>
 private void SetPaymentResult(WxPayData res)
 {
  var isSucessFlagOne = res.GetValue("return_code").ToString();
  var isSuccessFlagTwo = res.GetValue("result_code").ToString();

  if (isSucessFlagOne == "SUCCESS" && isSuccessFlagTwo == "SUCCESS")
  {
  //自己的业务逻辑 !!!!
  }
 }

 //查询订单
 private bool QueryOrder(string transaction_id)
 {
  WxPayData req = new WxPayData();
  req.SetValue("transaction_id", transaction_id);
  WxPayData res = WxPayApi.OrderQuery(req);
  if (res.GetValue("return_code").ToString() == "SUCCESS" &&
  res.GetValue("result_code").ToString() == "SUCCESS")
  {
  return true;
  }
  else
  {
  return false;
  }
 }

三、结尾

做完支付宝与微信扫码支付发现支付宝的接入要比微信方便很多,还有一个同步请求。而且吐槽个其它的,微信开放平台的审批速度要比支付宝的审批慢很多。还有微信支付最后上线前不需要非得用沙箱测试,做完之后直接一分钱一分钱测试即可。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 最详细的ASP.NET微信JS-SDK支付代码

    本文实例为大家分享了微信JS SDK支付的具体代码,供大家参考,具体内容如下 模型层实体类: public class JsEntities { /// <summary> /// 公众号id /// </summary> public string appId { get; set; } /// <summary> /// 时间戳 /// </summary> public string timeStamp { get; set; } /// <su

  • 解析微信支付的实现方法(.NET版)

    前段时间做了网页版微信支付,遇到很多问题,不过最终还是解决了,现在在这里记录下开发流程以及说明,给其他人一些参考. 一.准备工作 首先肯定得先要开通微信支付功能,之前开通微信支付需要三万的押金的,现在不需要了,所以就做了这个功能. 要进行微信支付开发,需要在公众号后台和微信商户后台进行相关的设置. 1.开发目录配置 微信支付需要在公众号后台(微信支付=>开发配置)进行配置支付授权目录.这里授权目录需要是线上地址,也就是可以通过互联网访问到的地址,微信支付系统需要能够通过互联网访问到你的地址. 微

  • .NET微信扫码支付接入(模式二-NATIVE)

    一.前言 经过两三天的琢磨总算完成了微信扫码支付功能,不得不感叹几句: 微信提供的DEMO不错,直接复制粘贴就可以跑起来了: 微信的配置平台我真是服了.公众平台.商户平台.开放平台,一个平台一套账户密码,大写的恶心        DEMO地址:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=11_1 .NET版DEMO中的Lib文件夹是关键,直接复制到自己的代码里,或者打成dll随个人意愿. 二.正文 Step1:肯定是产生商户

  • PHP 接入微信扫码支付总结(总结篇)

    微信扫码支付分为两种模式, 模式一比较复杂,需要公众号配置回调地址. 模式二比较简单,只需要在代码中配置回调地址就可以了. 我这次使用的是模式二. 需要配置参数, const APPID = 'xxx'; const MCHID = 'xxx'; const KEY = 'xxx'; const APPSECRET = 'xxx'; 配置公众号的appid,appsecret.以及微信支付的mchid与key. 生成二维码,这个页面需要自己去美化,不像支付宝那样自带效果. require_onc

  • JAVA微信扫码支付模式二线上支付功能实现以及回调

     一.准备工作 首先吐槽一下微信关于支付这块,本身支持的支付模式就好几种,但是官方文档特别零散,连像样的Java相关的demo也没几个.本人之前没有搞过微信支付,一开始真是被它搞晕,折腾两天终于调通了,特此写下来,以享后人吧! 关于准备工作,就"微信扫码支付模式二"官方文档地址在这 https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_1 可以先看看,实际上需要准备的东西有以下几个: 其中APP_ID和APP_SECRE

  • 微信公众平台开发教程⑤ 微信扫码支付模式介绍

    本文实例讲述了微信扫码支付模式.分享给大家供大家参考,具体如下: 背景:因为微信占据众多的用户群,作为程序开发,自然而然也成了研究的重点.毕竟个人能力有限,很难想象设计的复杂性,多数时间接触起来,各种蒙圈,在此笔记自己的操作流程,仅做参考,欢迎指正. 一.微信扫码支付模式 1.附带微信公众号"微信开发"中,对微信扫码支付的两种模式流程图以作"膜拜". 2.具体的操作,可详细参考官方开发文档 文档有强调: 模式一开发前,商户必须在公众平台后台设置支付回调URL.URL

  • 分享微信扫码支付开发遇到问题及解决方案-附Ecshop微信支付插件

    最近比较工作比较轻松,帮一个朋友的基于ecshop开发的商城加入微信扫描支付功能,本以为是很简单的事儿--下载官方sdk或开发帮助文档,按着里面的做就ok了,谁知折腾了两三天的时间才算搞定,中间也带着疑问在网上找了不少技术文章,却发现都只是比较粗略的写他们是怎么开发接入的,并没有解决我遇到的问题...,唉,有时候真心的感觉'只能靠自己'. 本文就是想把自己遇到的问题及解决办法写出来,让做这方面开发的朋友有所帮助! 开发之前,先查看官方[扫码支付]开发文档,扫码支付分为以下两种模式: △模式一:

  • Java SpringMVC实现PC端网页微信扫码支付(完整版)

    一:前期微信支付扫盲知识 前提条件是已经有申请了微信支付功能的公众号,然后我们需要得到公众号APPID和微信商户号,这个分别在微信公众号和微信支付商家平台上面可以发现.其实在你申请成功支付功能之后,微信会通过邮件把Mail转给你的,有了这些信息之后,我们就可以去微信支付服务支持页面:https://pay.weixin.qq.com/service_provider/index.shtml 打开这个页面,点击右上方的链接[开发文档]会进入到API文档说明页面,看起来如下 选择红色圆圈的扫码支付就

  • nodejs微信扫码支付功能实现

    前言 本篇文章主要是记录本人在微信扫码支付过程中所遇到的问题,给大家一个借鉴作用,希望对你们有帮助 开发环境 nodejs v8.1.0 egg v1.1.0 准备工作 微信公众号-appid 微信商户号-mch_id key值(签名算法所需,其实就是一个32位的密码,可以用md5生成一个)(key设置路径:微信商户平台(pay.weixin.qq.com)-->账户设置-->API安全-->密钥设置) 扫码支付-统一下单 以下才用的是微信模式二,因为比较简单 let MD5 = req

  • java实现网站微信扫码支付

    一.网站微信扫码支付开发并没有现成的java示例,总结一下自己微信扫码支付心得 二.首先去微信公众平台申请账户 https://mp.weixin.qq.com ** 三.账户开通.开发者认证之后就可以进行微信支付开发了 1.微信统一下单接口调用获取预支付id,以及生成二维码所需的codeUrl /** * 保存订单,并生成二维码所需的codeUrl * * @param request * @param response * @param notifyURLBuf * @param order

  • PC端微信扫码支付成功之后自动跳转php版代码

    本文实例为大家分享了php微信扫码支付成功之后自动跳转的具体代码,供大家参考,具体内容如下 场景: PC端   微信扫码支付 结果: 支付成功 自动跳转 实现思路: 支付二维码页面,写ajax请求支付状态,请求到结果,无论成功还是失败,都跳转到相应的结果页面 具体实现方法: html部分: 支付结果状态设定: 0 未支付  1 支付成功 2 支付失败 <input type="hidden" id="order_id" value="<?php

  • PHP 微信扫码支付源代码(推荐)

    代码中包含四个文件createUrl.php.ArrayToXML.php.returnGoodsUrl.php.notifyUrl.php . 具体详细代码大家可以参考下: createUrl.php:创建微信二维码支付链接 ``` /** * @author chantrans * 本页面的作用是生成商品二维码链接 */ echo createUrl("12314124"); /** * 产生随机字符串 */ function getNonceStr() $chars = 'ABC

随机推荐