.NET微信扫码支付接入(模式二微信扫码支付接入(模式二-NATIVE))
主要为大家详细介绍了.NET微信扫码支付接入的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考
一下
一、前言一、前言
经过两三天的琢磨总算完成了微信扫码支付功能,不得不感叹几句:
微信提供的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扫描出来的都是数字)
//大小(值越大生成的二维码图片像素越高)