开发环境:.NET MVC+ ORM框架(EF)
一、参考文档:1、微信JSAPI支付官方文档:https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=7_3&index=1;
二、开发前准备:1、必须申请微信公众平台(企业用户开通);
2、必须开通小程序平台,并与微信公众平台进行绑定;
3、必须开通微信商户平台,并妥善保管号商户号和商户密钥;
(值得说明的是:微信商户密钥在拿到手之后,请首先重置三次以上,具体原因不清楚,但是不重置的话,后期开发的时候,微信统一下单接口会频繁报错,而且错误信息莫名其妙,主要报错信息为:“签名错误”,即使你的参数签名在微信的签名校验工具中校验通过,也会提示你“签名错误”,但是此时你无需对接口做任何改动,只需要重置商户密钥3次以上,此问题便可解决)
4、网站升级https协议,因为调用微信支付成功后,微信服务器会对你传值的回调地址(notify_url字段,可以理解为具体的业务逻辑处理方法路径)进行回调,(虽然目前统一下单接口可以回调http协议接口,但是仍然建议网站升级为https协议);
三、支付流程1、统一下单接口,后台通过统一下单接口,向微信请求下单支付,微信后台接到参数后,会生成一个商户订单,并将预下单id(prepay_id 这个返回字段很重要)返回给后台;
2、后台接收微信返回值,进行二次签名,并将签名的参数返回给小程序前台;
3、小程序端接收到签名参数后,调用 wx.requestPayment 方法,传入参数,调起收银台;
4、用户支付后,微信服务器处理本次支付情况,并回调后台业务处理接口。
四、代码实现1、微信支付model类:
public class PayModel
{
/// <summary>
/// 统一下单API
/// </summary>
public static string orderUrl = ConfigurationManager.AppSettings["WXunifiedorder"].ToString();
/// <summary>
/// 支付结果通知API
/// </summary>
public static string notifyUrl = ConfigurationManager.AppSettings["WxPayNotifyurl"].ToString();
/// <summary>
/// 查询订单API
/// </summary>
public static string queryUrl = ConfigurationManager.AppSettings["WxPayQueryOrder"].ToString();
/// <summary>
/// 小程序唯一标识
/// </summary>
public static string AppID = ConfigurationManager.AppSettings["WxAppId"].ToString();
/// <summary>
/// 小程序的 app secret
/// </summary>
public static string secret = ConfigurationManager.AppSettings["WxSecret"].ToString();
/// <summary>
/// 商户号(微信支付分配的商户号)
/// </summary>
public static string mchid = ConfigurationManager.AppSettings["WxMerchantNo"].ToString();
/// <summary>
///商户平台设置的密钥key
/// </summary>
public static string WxMerchantKey = ConfigurationManager.AppSettings["WxMerchantKey"].ToString();
/// <summary>
/// 随机字符串不长于 32 位
/// </summary>
public static string nonceStr = RandomNum.CreateRandomNum(32).ToUpper();
/// <summary>
/// 时间戳 从1970年1月1日00:00:00至今的秒数,即当前的时间
/// </summary>
public static string timeStamp = Convert.ToInt64((DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0)).TotalSeconds).ToString();
/// <summary>
/// 交易类型 小程序取值如下:JSAPI
/// </summary>
public static string tradeType = "JSAPI";
/// <summary>
/// 签名类型 默认为MD5,支持HMAC-SHA256和MD5。
/// </summary>
public static string signType = "MD5";
/// <summary>
/// 商品描述 商品简单描述,该字段请按照规范传递
/// </summary>
public static string body = "挪威躺椅";
/// <summary>
/// 附加数据 在查询API和支付通知中原样返回
/// </summary>
public static string attach = "商城支付";
/// <summary>
/// 签名,参与签名参数:appid,mch_id,transaction_id,out_trade_no,nonce_str,key
/// </summary>
public string sign = "";
/// <summary>
/// 微信订单号,优先使用
/// </summary>
public string transactionid = "";
/// <summary>
/// 商户系统内部订单号
/// </summary>
public string out_trade_no = "";
/// <summary>
/// 订单金额
/// </summary>
public decimal totalfee=0;
}
public class OrderReloadModel
{
public string return_msg { get; set; }
public string return_code { get; set; }
public string orderNo { get; set; }
public string AppID { get; set; }
public string package { get; set; }
public string timeStamp { get; set; }
public string nonecStr { get; set; }
public string signType { get; set; }
public string paysign { get; set; }
}