微信app支付須要如下參數,類封裝以下api
public class WxPayModel { /// <summary> /// 應用ID /// </summary> public string appid { set; get; } = ""; /// <summary> /// 商戶號 /// </summary> public string partnerid{ set; get; } = ""; /// <summary> /// 預支付交易會話ID /// </summary> public string prepayid { set; get; } = ""; /// <summary> /// 擴展字段 /// </summary> public string package { set; get; } = "Sign=WXPay"; /// <summary> /// 隨機字符串 /// </summary> public string noncestr { set; get; } = ""; /// <summary> /// 時間戳 /// </summary> public string timestamp { set; get; } = ""; /// <summary> /// 簽名 /// </summary> public string sign { set; get; } = ""; }
支付業務邏輯類以下,只須要傳遞訂單號out_trade_no,描述body,價格total_fee,客戶端ip,返回一個WxPayModel供app端調用。服務器
/// <summary> /// 獲取微信APP支付須要的信息 /// </summary> /// <param name="out_trade_no">訂單號</param> /// <param name="body">描述</param> /// <param name="total_fee">總價</param> /// <param name="ip">客戶IP</param> /// <returns></returns> public WxPayModel GetWxAppPayInfo(string out_trade_no, string body, string total_fee, string ip) { //構造返回內容,缺乏prepayid和sign須要去微信服務器獲取 WxPayModel wxPayModel = new WxPayModel() { appid = wxPayConfig.appid, partnerid = wxPayConfig.mchid, timestamp = Senparc.Weixin.Helpers.DateTimeHelper.GetWeixinDateTime(DateTime.Now) + "", noncestr = TenPayV3Util.GetNoncestr(), }; //構造請求參數 Senparc.Weixin.MP.TenPayLibV3.RequestHandler packageReqHandler = new Senparc.Weixin.MP.TenPayLibV3.RequestHandler(); #region 構造請求參數 packageReqHandler.SetParameter("appid", wxPayConfig.appid);//APPID packageReqHandler.SetParameter("mch_id", wxPayConfig.mchid);//商戶號 packageReqHandler.SetParameter("nonce_str", Senparc.Weixin.MP.TenPayLibV3.TenPayV3Util.GetNoncestr());//隨機串 packageReqHandler.SetParameter("body", body); packageReqHandler.SetParameter("out_trade_no", out_trade_no);//訂單號 packageReqHandler.SetParameter("total_fee", (int)(Convert.ToDecimal(total_fee) * 100) + ""); //金額,以分爲單位 packageReqHandler.SetParameter("spbill_create_ip", ip);//IP packageReqHandler.SetParameter("notify_url", wxPayConfig.notify_url); //回調地址 packageReqHandler.SetParameter("trade_type", "APP");//APP支付 packageReqHandler.SetParameter("sign", packageReqHandler.CreateMd5Sign("key", wxPayConfig.key));//商戶API密鑰(簽名) #endregion //將參數轉爲xml字符串 string data = packageReqHandler.ParseXML(); //發起post異步請求,獲取返回的內容 var result = PostWithStringFile(wxPayConfig.api_url, data); Log.Info("【GetWxAppPayInfo】訂單:" + out_trade_no + ",請求獲得的xml:" + result, "微信支付"); var res = System.Xml.Linq.XDocument.Parse(result);//解析xml,爲了填充prepay_id參數和_paySign參數。 try { //填充prepay_id參數 wxPayModel.prepayid = res.Element("xml").Element("prepay_id").Value; SortedDictionary<string, object> sParams = new SortedDictionary<string, object>();
sParams.Add("appid", wxPayModel.appid);
sParams.Add("noncestr", wxPayModel.noncestr);
sParams.Add("package", "Sign=WXPay");
sParams.Add("partnerid", wxPayModel.partnerid);
sParams.Add("prepayid", wxPayModel.prepayid);
sParams.Add("timestamp", wxPayModel.timestamp);微信
//填充sign參數 wxPayModel.sign = GetSign(sParams, wxPayConfig.key); } catch (Exception ex) { Log.Info($"【GetWxAppPayInfo】訂單:{out_trade_no },異常:{ ex.ToString()}", "微信支付"); } return wxPayModel; }
其中獲取微信簽名方法以下app
#region 獲取微信簽名 /// <summary> /// 獲取微信簽名 /// </summary> /// <param name="sParams"></param> /// <returns></returns> public string GetSign(SortedDictionary<string, object> sParams, string key) { string sign = string.Empty; StringBuilder sb = new StringBuilder(); foreach (KeyValuePair<string, object> temp in sParams) { if (string.IsNullOrEmpty(temp.Value +"") || temp.Key.ToLower() == "sign") { continue; } sb.Append(temp.Key.Trim() + "=" + temp.Value.ToString() + "&"); } sb.Append("key=" + key.Trim() + ""); string signkey = sb.ToString(); sign = Senparc.Weixin.Helpers.EncryptHelper.GetMD5(signkey); return sign; } #endregion
這樣只要應用開通了微信app支付功能,就能正確返回app sdk支付所須要的數據。異步