http://www.sufeinet.com/plugin.php?id=keke_group

苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper爬虫框架(V2.7-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 4135|回复: 1
打印 上一主题 下一主题

[支付] c#-微信统一下单,生成支付二维码

[复制链接]
跳转到指定楼层
楼主
发表于 2021-6-15 15:02:59 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
      现在微信支付二维码, 已经比较常见了, 但是代码各种各样, 有时候经常查找资料, 找到得代码不一样, 也会出现问题, 要不这个地方出错,那个地方出错,没有一个完整得代码。              今天新开项目, 做支付, 就把微信支付的代码重新整理了下,先把源码粘贴如下, 需要得拿走不谢哈

1. 获取微信支付二维码链接

[C#] 纯文本查看 复制代码
WxPayData data = new WxPayData(config);
data.SetValue("body", $"苏飞论坛[个人vip半年]订单");//商品描述          
data.SetValue("attach", string.Format("{0}SUFEINETTC{1}", uinfo.comid, uinfo.uid));//附加数据 
data.SetValue("out_trade_no", out_trade_no);//随机字符串         
data.SetValue("total_fee", 100);//总金额
data.SetValue("time_start", DateTime.Now.ToString("yyyyMMddHHmmss"));//交易起始时间
data.SetValue("time_expire", DateTime.Now.AddMinutes(10).ToString("yyyyMMddHHmmss"));//交易结束时间
data.SetValue("goods_tag", "苏飞论坛[个人vip半年]套餐订单");//商品标记
data.SetValue("trade_type", "NATIVE");//交易类型out_trade_no
data.SetValue("product_id", order_id);//商品ID
data.SetValue("notify_url", "http://sufeinet.com/admin/membercenter/wxnotify.aspx");//回调地址

WxPayData wx_result = new WxPayApi(config).UnifiedOrder(data);//调用统一下单接口

string url = wx_result.GetValue("code_url").ToString();//获得统一下单接口返回的二维码链接 

GetUrlImg(url);


调用统一下单接口:
[C#] 纯文本查看 复制代码
/**
        * 
        * 统一下单
        * @param WxPaydata inputObj 提交给统一下单API的参数
        * @param int timeOut 超时时间
        * @throws WxPayException
        * @return 成功时返回,其他抛异常
        */
        public WxPayData UnifiedOrder(WxPayData inputObj, int timeOut = 30)
        {
            string url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
            //检测必填参数
            if (!inputObj.IsSet("out_trade_no"))
            {
                throw new WxPayException("缺少统一支付接口必填参数out_trade_no!");
            }
            else if (!inputObj.IsSet("body"))
            {
                throw new WxPayException("缺少统一支付接口必填参数body!");
            }
            else if (!inputObj.IsSet("total_fee"))
            {
                throw new WxPayException("缺少统一支付接口必填参数total_fee!");
            }
            else if (!inputObj.IsSet("trade_type"))
            {
                throw new WxPayException("缺少统一支付接口必填参数trade_type!");
            }

            //关联参数
            if (inputObj.GetValue("trade_type").ToString() == "JSAPI" && !inputObj.IsSet("openid"))
            {
                throw new WxPayException("统一支付接口中,缺少必填参数openid!trade_type为JSAPI时,openid为必填参数!");
            }
            if (inputObj.GetValue("trade_type").ToString() == "NATIVE" && !inputObj.IsSet("product_id"))
            {
                throw new WxPayException("统一支付接口中,缺少必填参数product_id!trade_type为JSAPI时,product_id为必填参数!");
            }

            //异步通知url未设置,则使用配置文件中的url
            if (!inputObj.IsSet("notify_url"))
            {
                inputObj.SetValue("notify_url", WxPayConfig.NOTIFY_URL);//异步通知url
            }
            inputObj.SetValue("appid", WxPayConfig.APPID);//公众账号ID
            inputObj.SetValue("mch_id", WxPayConfig.MCHID);//商户号
            inputObj.SetValue("spbill_create_ip", WxPayConfig.IP);//终端ip                      
            inputObj.SetValue("nonce_str", GenerateNonceStr());//随机字符串
                                                               //签名
            inputObj.SetValue("sign", inputObj.MakeSign());
            string xml = inputObj.ToXml();

            var start = DateTime.Now;

            //Log.Debug("WxPayApi", "UnfiedOrder request : " + xml);
            string response = HttpService.Post(xml, url, false, timeOut);
            //Log.Debug("WxPayApi", "UnfiedOrder response : " + response);

            //var end = DateTime.Now;
            //int timeCost = (int)((end - start).TotalMilliseconds);

            WxPayData result = new WxPayData(WxPayConfig);
            result.FromXml(response);

            //ReportCostTime(url, timeCost, result);//测速上报

            return result;
        }


2. 获取到url地址后, 将rul地址转换成图片流,直接输出
[C#] 纯文本查看 复制代码
/// <summary>
        /// 将微信范围的url生成二维码
        /// </summary>
        /// <param name="url"></param>
        private void GetUrlImg(string url)
        {
            QrEncoder qrEncoder = new QrEncoder(ErrorCorrectionLevel.H);
            QrCode qrCode = new QrCode();
            qrEncoder.TryEncode(url, out qrCode);
            using (MemoryStream ms = new MemoryStream())
            {
                var renderer = new GraphicsRenderer(new FixedModuleSize(4, QuietZoneModules.Two));
                renderer.WriteToStream(qrCode.Matrix, ImageFormat.Png, ms);

                this.Response.Clear();
                Response.ContentType = "image/png";
                Response.OutputStream.Write(ms.GetBuffer(), 0, (int)ms.Length);
                this.Response.End();
            }
        }



以上方法为主方法, 下载源码,请点击》》 weixinpay_API_20210615.zip (9.59 KB, 下载次数: 0)


1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备18043678号-2)

GMT+8, 2024-11-23 11:28

© 2014-2021

快速回复 返回顶部 返回列表