关于.NET微信支付集成的记录
闲来无事集成一下微信支付,涉及到 pc端支付、小程序、H5、公众号内部支付等。
因此特意封装了一个类库,这里简单记录一下。
类库名:Yi.WeiXin.Pay
里面集成了请求http的一个框架:Flurl.Http
注:Flurl也集成了微信支付的功能,功能更全、更强大,我这个只是简单的几个支付。200行代码左右,体积小。
直接上nuget就可以搜到。
安装好之后,引入
using Yi.WeiXin.Pay;
using Yi.WeiXin.Pay.Model;
主要是涉及到三个实体类:
new WxPayParamIn();//微信支付需要传递的参数所对应实体类
new WxPayApiResult();//请求成功后,微信官方返回的数据。
new WxSignParam();//商户信息
下面是三个类的具体信息
WxPayParamIn
/// <summary>
/// 根据开发者文档,构建微信支付相关参数对应类
/// </summary>
public class WxPayParamIn
{
/// <summary>
/// 商户号
/// </summary>
public string? mchid { get; set; }
/// <summary>
/// 商户系统内部订单号,只能是数字、大小写字母_-*且在同一个商户号下唯一[6,32]
/// </summary>
public string? out_trade_no { get; set; }
/// <summary>
/// 公众号 或者 小程序的appID 视情况而定
/// </summary>
public string? appid { get; set; }
/// <summary>
/// 商品描述
/// </summary>
public string? description { get; set; }
/// <summary>
/// 支付成功后,回调地址
/// </summary>
public string? notify_url { get; set; }
/// <summary>
/// 价格
/// </summary>
public Amount? amount { get; set; }
/// <summary>
/// 附加信息
/// </summary>
public string? attach { get; set; }
/// <summary>
/// 小程序 和 JSAPI 特有属性 添加标题当属性值为null 转json时自动忽略当前当前属性
/// </summary>
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public Payer? payer { get; set; }
/// <summary>
///H5特有 场景 添加标记当属性值为null 转json时自动忽略当前属性
/// </summary>
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public Scene_info? scene_info { get; set; }
}
/// <summary>
///
/// </summary>
public class Amount
{
/// <summary>
/// 单位 分
/// </summary>
public int total { get; set; }
}
/// <summary>
///
/// </summary>
public class Payer
{
/// <summary>
/// 用户的openid
/// </summary>
public string? openid { get; set; }
}
/// <summary>
///
/// </summary>
public class Scene_info
{
/// <summary>
/// 客户端的IP
/// </summary>
public string? payer_client_ip;
/// <summary>
///H5支付详细信息
/// </summary>
public H5Info? h5_info;
}
/// <summary>
///
/// </summary>
public class H5Info
{
/// <summary>
/// 设备类型;IOS 或 Android
/// </summary>
public string? type { get; set; }
}
/// <summary>
///
/// </summary>
public class WxPayApiResult
{
/// <summary>
/// 调用微信支付的链接,制作成二维码,可以实现扫码直接。或在微信直接点开,可直接支付;
/// </summary>
public string? code_url { get; set; }
/// <summary>
/// 预支付凭证,调起微信支付的凭证
/// </summary>
public string? prepay_id { get; set; }
/// <summary>
/// H5支付链接
/// </summary>
public string? h5_url { get; set; }
}
WxSignParam
/// <summary>
/// 商户签名信息
/// </summary>
public class WxSignParam
{
/// <summary>
/// 商户密钥
/// </summary>
public string? PrivateKey { get; set; }
/// <summary>
/// 商户号
/// </summary>
public string? MerchantId { get; set; }
/// <summary>
/// 证书序列号
/// </summary>
public string? CertificateSerialNo { get; set; }
/// <summary>
/// 商户公钥
/// </summary>
public string? PublicKey { get; set; }
/// <summary>
/// 回调地址
/// </summary>
public string? NotifyUrl { get; set; }
}
WxPayApiResult
public class WxPayApiResult
{
/// <summary>
/// 调用微信支付的链接,制作成二维码,可以实现扫码直接。或在微信直接点开,可直接支付;
/// </summary>
public string? code_url { get; set; }
/// <summary>
/// 预支付凭证,调起微信支付的凭证
/// </summary>
public string? prepay_id { get; set; }
/// <summary>
/// H5支付链接
/// </summary>
public string? h5_url { get; set; }
}
具体使用细节
具体使用:PC端↓↓↓
//生成订单号
var orderNo = DateTime.Now.Ticks;
WxPayParamIn wxPayParamIn = new WxPayParamIn
{
//公众号的appID
appid = "xxxxxxxxxxxxxx",
//商户号
mchid = ycteOptions.MerchantId,
//商品描述
description = "商品",
//订单号 唯一 商户系统内部订单号,只能是数字、大小写字母_-*且在同一个商户号下唯一
out_trade_no = orderNo.ToString(),
//回调地址
notify_url = ycteOptions.NotifyUrl
};
//商品价格
Amount amount = new Amount
{
total = 1//单位分
};
wxPayParamIn.amount = amount;
//自定义的附加信息,会在回调接口出,带着出来。
wxPayParamIn.attach = "这是附加信息";
//请求微信支付API
var codeUrl = await YiWxPay.WxPayPCAsync(wxSignParam, wxPayParamIn);
具体使用:小程序支付↓↓↓
//生成订单号
var orderNo = DateTime.Now.Ticks;
//和Jsapi 一样 可以使用 WxPayParamJsapiIn
WxPayParamIn wxPayParamIn = new WxPayParamIn
{
//小程序的appID *****不同于公众号内部支付*****
appid = "xxxxxxxxxxxxxx",
//商户号
mchid = ycteOptions.MerchantId,
//商品描述
description = "商品描述",
//订单号
out_trade_no = orderNo.ToString(),
//回调地址
notify_url = ycteOptions.NotifyUrl
};
//商品价格
Amount amount = new Amount
{
total = 1//单位分
};
wxPayParamIn.amount = amount;
//自定义的附加信息,会在回调接口出,带着出来。
wxPayParamIn.attach = "这是附加信息";
//微信小程序用户的openid *****不同于公众号内部支付*****
var payer = new Payer
{
openid = "用户的openId"
};
wxPayParamIn.payer = payer;
//请求微信支付API
var prepay_id = await YiWxPay.WxPayMiniAsync(wxSignParam, wxPayParamIn);
具体使用:H5支付
//生成订单号
var orderNo = DateTime.Now.Ticks;
WxPayParamIn wxPayParamIn = new WxPayParamIn
{
//公众号的appID
appid = "xxxxxxxxx",
//商户号
mchid = ycteOptions.MerchantId,
//商品描述
description = "商品描述",
//订单号
out_trade_no = orderNo.ToString(),
//回调地址
notify_url = ycteOptions.NotifyUrl
};
//商品价格
Amount amount = new()
{
total = 1//单位分
};
wxPayParamIn.amount = amount;
//自定义的附加信息,会在回调接口出,带着出来。
wxPayParamIn.attach = "这是附加信息";
var scene_Info = new Scene_info
{
payer_client_ip = "192.168.0.1"//真实客户端IP
};
var h5_Info = new H5Info
{
type = "IOS"//场景类型 示例值:iOS, Android, Wap
};
scene_Info.h5_info = h5_Info;
wxPayParamIn.scene_info = scene_Info;
//请求微信支付API
var h5_url = await YiWxPay.WxPayH5Async(wxSignParam, wxPayParamIn);
具体使用:公众号内部支付
//生成订单号
var orderNo = DateTime.Now.Ticks;
WxPayParamIn wxPayParamIn = new WxPayParamIn
{
//公众号的appID
appid = "xxxxxxxxxxxxx",
//商户号
mchid = ycteOptions.MerchantId,
//商品描述
description = "商品描述",
//订单号
out_trade_no = orderNo.ToString(),
//回调地址
notify_url = ycteOptions.NotifyUrl
};
//商品价格
Amount amount = new Amount
{
total = 1//单位分
};
wxPayParamIn.amount = amount;
//自定义的附加信息,会在回调接口出,带着出来。
wxPayParamIn.attach = "这是附加信息";
//微信用户的openid
var payer = new Payer
{
openid = "用户的openId"
};
wxPayParamIn.payer = payer;
//请求微信支付API
var prepay_id = await YiWxPay.WxPayJsApiAsync(wxSignParam, wxPayParamIn);
请求完成之后,返回的参数,可以根据个人的业务需求,进行处理。
如:
pc端支付返回的是一个类似链接的东西,将其制作成二维码,通过微信扫描次二维码,即可直接跳转至维系内支付页面。
h5端支付返回的是一个h5的支付链接链接,在H5页面直接跳转到次链接会自动调起微信支付。注意:苹果手机自带的浏览器似乎不行。
小程序和公众号内部支付都是返回一个预支付凭证,由前端拿着此凭证通过微信提供的jsapi 调起微信支付。
就记录到这里吧。