/// <summary> /// 生成要请求给支付宝的参数数组 /// </summary> /// <param name="sParaTemp">请求前的参数数组</param> /// <returns>要请求的参数数组</returns> private static Dictionary <string, string> BuildRequestPara(Dictionary <string, string> sParaTemp) { //待签名请求参数数组 Dictionary <string, string> sPara = new Dictionary <string, string>(); //签名结果 string mysign = ""; //过滤签名参数数组 sPara = AlipayCore.FilterPara(sParaTemp); //根据字母a到z的顺序把参数排序 sPara = AlipayCore.SortPara(sPara); //获得签名结果 mysign = BuildRequestMysign(sPara); //签名结果与签名方式加入请求提交参数组中 sPara.Add("sign", mysign); if (sPara["service"] != "alipay.wap.trade.create.direct" && sPara["service"] != "alipay.wap.auth.authAndExecute") { sPara.Add("sign_type", _sign_type); } return(sPara); }
/// <summary> /// 通知调用 /// </summary> public ActionResult Notify() { //string forms = "discount=0.00&payment_type=1&subject=%u9ed1%u7c73%u58f3&trade_no=2016111521001004630270573220&buyer_email=15670179992&gmt_create=2016-11-15+09%3a29%3a16¬ify_type=trade_status_sync&quantity=1&out_trade_no=1115092904-1643&seller_id=2088421544580296¬ify_time=2016-11-15+10%3a55%3a09&body=%u8bdd%u8d39%u5957%u9910&trade_status=TRADE_SUCCESS&is_total_fee_adjust=N&total_fee=0.01&gmt_payment=2016-11-15+09%3a29%3a17&seller_email=cbaohai%40126.com&price=0.01&buyer_id=2088012967203633¬ify_id=53526949d59c9297c6641bd8e450a03kv2&use_coupon=N&sign_type=RSA&sign=WDJhrGG2kEgGvKtfPG3WoMn8mwleWbyDTR0scZ6HmSK39OZnlHKS8lSTkYM09ZY4y7%2bxTM1IeNmFsVcbK%2bVJK2jHYX43RyEIyBkCgJVuo0IpUDPYZidyrgEeGKoeV0FPutykbLIueQNSoAENkPsAmFWd1J1FQMYvF8akJL1R%2b5k%3d"; //forms = HttpUtility.UrlDecode(forms, Encoding.UTF8); SortedDictionary <string, string> sPara = AlipayCore.GetRequestPost(); //Dictionary<string, string> dic = CommonHelper.ParmsToDic(forms); //foreach (KeyValuePair<string, string> kv in dic) //{ // sPara[kv.Key] = kv.Value; //} //BSPLog.Instance.Write(Request.Form.ToString()); if (sPara.Count > 0)//判断是否有带返回参数 { bool verifyResult = AlipayNotify.AppVerify(sPara, sPara["notify_id"], sPara["sign"], AlipayConfig.AppSignType, AlipayConfig.PublicKey, AlipayConfig.AppInputCharset, AlipayConfig.AppVeryfyUrl, AlipayConfig.Partner); if (verifyResult && (sPara["trade_status"] == "TRADE_FINISHED" || sPara["trade_status"] == "TRADE_SUCCESS")) //验证成功 { string out_trade_no = sPara["out_trade_no"]; //商户订单号 string tradeSN = sPara["trade_no"]; //支付宝交易号 decimal tradeMoney = TypeHelper.StringToDecimal(sPara["total_fee"]); //交易金额 DateTime tradeTime = TypeHelper.StringToDateTime(sPara["gmt_payment"]); //交易时间 return(Content(Recharge.UpdateRecharge(tradeMoney.ToString(), out_trade_no, sPara["gmt_payment"], tradeSN))); } else//验证失败 { return(Content("fail")); } } else { return(Content("无通知参数")); } }
/// <summary> /// 生成请求时的签名 /// </summary> /// <param name="sPara">请求给支付宝的参数数组</param> /// <returns>签名结果</returns> private static string BuildRequestMysign(Dictionary <string, string> sPara) { //把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串 string prestr = AlipayCore.CreateLinkString(sPara); //把最终的字符串签名,获得签名结果 string mysign = ""; switch (_sign_type) { case "MD5": mysign = Mozart.Payment.AliPay.AlipayMD5.Sign(prestr, _key, _input_charset); break; case "RSA": mysign = AlipayRSAFromPkcs8.sign(prestr, _private_key, _input_charset); break; case "0001": mysign = AlipayRSAFromPkcs8.sign(prestr, _private_key, _input_charset); break; default: mysign = ""; break; } return(mysign); }
/// <summary> /// 阿里大于发送短信 /// </summary> /// <param name="to">接收人号码</param> /// <param name="smsparam">短信模板变量</param> /// <param name="smssignname">短信签名名称</param> /// <param name="tempcode">模板编号</param> /// <returns></returns> public bool AliSend(string to, string smsparam, string smssignname, string tempcode) { // 第一步:把字典按Key的字母顺序排序 IDictionary <string, string> sortedParams = BuildParms(to, smsparam, smssignname, tempcode); IEnumerator <KeyValuePair <string, string> > dem = sortedParams.GetEnumerator(); // 第二步:把所有参数名和参数值串在一起 StringBuilder query = new StringBuilder(); query.Append(_app_secret); while (dem.MoveNext()) { string key = dem.Current.Key; string value = dem.Current.Value; if (!string.IsNullOrEmpty(key) && !string.IsNullOrEmpty(value)) { query.Append(key).Append(value); } } // 第三步:使用MD5/HMAC加密 byte[] bytes; query.Append(_app_secret); MD5 md5 = MD5.Create(); bytes = md5.ComputeHash(Encoding.UTF8.GetBytes(query.ToString())); // 第四步:把二进制转化为大写的十六进制 StringBuilder signres = new StringBuilder(); for (int i = 0; i < bytes.Length; i++) { signres.Append(bytes[i].ToString("X2")); } string sign = signres.ToString(); sortedParams["sign"] = sign; //把参数组中所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串,并对参数值做urlencode string strRequestData = AlipayCore.CreateLinkStringUrlencode(sortedParams, Encoding.UTF8); string result = WebHelper.GetRequestData(_url + "?" + strRequestData, "get"); if (result.Contains("<success>true</success>")) { return(true); } else { logger.Error(result); return(false); } }
/// <summary> /// 生成要请求给支付宝的参数数组 /// </summary> /// <param name="sParaTemp">请求前的参数数组</param> /// <param name="code">字符编码</param> /// <returns>要请求的参数数组字符串</returns> private static string BuildRequestParaToString(Dictionary <string, string> sParaTemp, Encoding code) { //待签名请求参数数组 Dictionary <string, string> sPara = new Dictionary <string, string>(); sPara = BuildRequestPara(sParaTemp); //把参数组中所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串,并对参数值做urlencode string strRequestData = AlipayCore.CreateLinkStringUrlencode(sPara, code); return(strRequestData); }
/// <summary> /// 返回调用 /// </summary> public ActionResult Return() { SortedDictionary <string, string> paras = AlipayCore.GetRequestGet(); if (paras.Count > 0)//判断是否有带返回参数 { bool verifyResult = AlipayNotify.Verify(paras, Request.QueryString["notify_id"], Request.QueryString["sign"], AlipayConfig.SignType, AlipayConfig.Key, AlipayConfig.Code, AlipayConfig.VeryfyUrl, AlipayConfig.Partner); if (verifyResult && (Request.QueryString["trade_status"] == "TRADE_FINISHED" || Request.QueryString["trade_status"] == "TRADE_SUCCESS")) //验证成功 { string out_trade_no = Request.QueryString["out_trade_no"]; //商户订单号 string tradeSN = Request.QueryString["trade_no"]; //支付宝交易号 decimal tradeMoney = TypeHelper.StringToDecimal(Request.QueryString["total_fee"]); //交易金额 DateTime tradeTime = TypeHelper.StringToDateTime(Request.QueryString["notify_time"]); //交易时间 int oid = TypeHelper.StringToInt(StringHelper.SubString(out_trade_no, out_trade_no.Length - 10)); OrderInfo orderInfo = Orders.GetOrderByOid(oid); if (orderInfo != null && orderInfo.PayMode == 1 && orderInfo.PaySN.Length == 0 && orderInfo.SurplusMoney > 0 && orderInfo.SurplusMoney <= tradeMoney) { Orders.PayOrder(oid, OrderState.Confirming, tradeSN, "alipay", "支付宝", DateTime.Now); OrderActions.CreateOrderAction(new OrderActionInfo() { Oid = oid, Uid = orderInfo.Uid, RealName = "本人", AdminGid = 1, AdminGTitle = "非管理员", ActionType = (int)OrderActionType.Pay, ActionTime = tradeTime, ActionDes = "你使用支付宝支付订单成功,支付宝交易号为:" + tradeSN }); //邮件通知客户 if (!string.IsNullOrWhiteSpace(orderInfo.Email)) { Emails.SendOrderPayEmail(orderInfo.Email, "支付宝", tradeMoney.ToString(), orderInfo.OSN); } } return(RedirectToAction("payresult", "order", new RouteValueDictionary { { "oid", oid } })); } else//验证失败 { return(Content("支付失败")); } } else { return(Content("支付失败")); } }
/// <summary> /// 获取待签名字符串(调试用) /// </summary> /// <param name="inputPara">通知返回参数数组</param> /// <returns>待签名字符串</returns> public string GetPreSignStr(Dictionary <string, string> inputPara) { Dictionary <string, string> sPara = new Dictionary <string, string>(); //过滤空值、sign与sign_type参数 sPara = AlipayCore.FilterPara(inputPara); //根据字母a到z的顺序把参数排序 sPara = AlipayCore.SortPara(sPara); //获取待签名字符串 string preSignStr = AlipayCore.CreateLinkString(sPara); return(preSignStr); }
/// <summary> /// 获取返回时的签名验证结果 /// </summary> /// <param name="inputPara">通知返回参数数组</param> /// <param name="sign">对比的签名结果</param> /// <param name="isSort">是否对待签名数组排序</param> /// <returns>签名验证结果</returns> private bool GetSignVeryfy(Dictionary <string, string> inputPara, string sign, bool isSort) { Dictionary <string, string> sPara = new Dictionary <string, string>(); //过滤空值、sign与sign_type参数 sPara = AlipayCore.FilterPara(inputPara); if (isSort) { //根据字母a到z的顺序把参数排序 sPara = AlipayCore.SortPara(sPara); } else { sPara = SortNotifyPara(sPara); } //获取待签名字符串 string preSignStr = AlipayCore.CreateLinkString(sPara); //获得签名验证结果 bool isSgin = false; if (sign != null && sign != "") { switch (_sign_type) { case "MD5": isSgin = Mozart.Payment.AliPay.AlipayMD5.Verify(preSignStr, sign, _key, _input_charset); break; case "RSA": isSgin = AlipayRSAFromPkcs8.verify(preSignStr, sign, _public_key, _input_charset); break; case "0001": isSgin = AlipayRSAFromPkcs8.verify(preSignStr, sign, _public_key, _input_charset); break; default: break; } } return(isSgin); }
/// <summary> /// 通知调用 /// </summary> public ActionResult Notify() { SortedDictionary <string, string> paras = AlipayCore.GetRequestPost(); if (paras.Count > 0)//判断是否有带返回参数 { bool verifyResult = AlipayNotify.Verify(paras, Request.Form["notify_id"], Request.Form["sign"], AlipayConfig.SignType, AlipayConfig.Key, AlipayConfig.Code, AlipayConfig.VeryfyUrl, AlipayConfig.Partner); if (verifyResult && (Request.Form["trade_status"] == "TRADE_FINISHED" || Request.Form["trade_status"] == "TRADE_SUCCESS")) //验证成功 { string out_trade_no = Request.Form["out_trade_no"]; //商户订单号 string tradeSN = Request.QueryString["trade_no"]; //支付宝交易号 decimal tradeMoney = TypeHelper.StringToDecimal(Request.QueryString["total_fee"]); //交易金额 DateTime tradeTime = TypeHelper.StringToDateTime(Request.QueryString["gmt_payment"]); //交易时间 int oid = TypeHelper.StringToInt(StringHelper.SubString(out_trade_no, out_trade_no.Length - 10)); OrderInfo orderInfo = Orders.GetOrderByOid(oid); if (orderInfo != null && orderInfo.PayMode == 1 && orderInfo.PaySN.Length == 0 && orderInfo.SurplusMoney > 0 && orderInfo.SurplusMoney <= tradeMoney) { Orders.PayOrder(oid, OrderState.Confirming, tradeSN, DateTime.Now); OrderActions.CreateOrderAction(new OrderActionInfo() { Oid = oid, Uid = orderInfo.Uid, RealName = "本人", AdminGid = 1, AdminGTitle = "非管理员", ActionType = (int)OrderActionType.Pay, ActionTime = tradeTime, ActionDes = "你使用支付宝支付订单成功,支付宝交易号为:" + tradeSN }); } return(Content("success")); } else//验证失败 { return(Content("fail")); } } else { return(Content("无通知参数")); } }
/// <summary> /// 生成App支付订单参数信息 /// 老版:https://doc.open.alipay.com/docs/doc.htm?spm=a219a.7629140.0.0.wJXHY0&treeId=59&articleId=103563&docType=1 /// 新版:https://doc.open.alipay.com/docs/doc.htm?spm=a219a.7629140.0.0.HHgJg3&treeId=193&articleId=105297&docType=1 /// </summary> /// <param name="outTradeNo">业务单号</param> /// <param name="subject">支付标题</param> /// <param name="body">支付内容</param> /// <param name="totalFee">支付金额</param> /// <returns></returns> public static string GetPayString(string outTradeNo, string subject, string body, decimal totalFee) { try { #region 数据 Dictionary <string, string> dic = new Dictionary <string, string>(); dic.Add("app_id", AlipayConfig.App_ID); dic.Add("method", "alipay.trade.app.pay"); dic.Add("sign_type", AlipayConfig.Sign_type); dic.Add("charset", "utf-8"); dic.Add("timestamp", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); dic.Add("version", "1.0"); dic.Add("notify_url", AlipayConfig.Notify_Url); #region biz_content Dictionary <string, string> biz = new Dictionary <string, string>(); biz.Add("subject", subject); biz.Add("body", body); biz.Add("out_trade_no", outTradeNo); biz.Add("timeout_express", "30m"); //该笔订单允许的最晚付款时间,逾期将关闭交易。取值范围:1m~15d。m-分钟,h-小时,d-天,1c-当天(1c-当天的情况下,无论交易何时创建,都在0点关闭)。 该参数数值不接受小数点, 如 1.5h,可转换为 90m。 biz.Add("total_amount", totalFee.ToString()); //单元(元) biz.Add("seller_id", AlipayConfig.Seller); biz.Add("product_code", "QUICK_MSECURITY_PAY"); #endregion dic.Add("biz_content", JsonConvert.SerializeObject(biz)); //生成签名 dic.Add("sign", AlipayCore.CreateSign(dic)); #endregion return(AlipayCore.CreateLinkStringUrlencode(dic, Encoding.UTF8)); } catch (Exception ex) { LogHelper.SaveFileLog("WxPayUtils.GetAppPayString", ex.Message); } return(""); }
/// <summary> /// 支付 /// </summary> public ActionResult Pay() { string result = WebHelper.GetPostStr(); NameValueCollection parmas = WebHelper.GetParmList(result); //if (parmas.Keys.Count < 5) //{ // return Content("缺少请求参数"); //} //支付类型,必填,不能修改 string paymentType = "1"; //服务器异步通知页面路径,需http://格式的完整路径,不能加?id=123这类自定义参数 string notifyUrl = string.Format("{0}/appalipay/notify", BSPConfig.ShopConfig.SiteUrl); //收款支付宝帐户 string sellerEmail = AlipayConfig.Seller; //合作者身份ID string partner = AlipayConfig.Partner; //交易安全检验码 string key = AlipayConfig.Key; //商户订单号 string outTradeNo = "hmk" + DateTime.Now.ToString("yyMMdd") + Randoms.CreateRandomValue(6, true); //订单名称 string subject = BSPConfig.ShopConfig.SiteTitle; //付款金额 string totalFee = double.Parse(parmas["totalFee"]).ToString(); //订单描述 string body = "话费套餐"; Encoding e = Encoding.GetEncoding(AlipayConfig.AppInputCharset); //把请求参数打包成数组 SortedDictionary <string, string> parms = new SortedDictionary <string, string>(); parms.Add("service", "mobile.securitypay.pay"); parms["partner"] = partner; parms.Add("_input_charset", AlipayConfig.AppInputCharset); parms["seller_id"] = sellerEmail; parms["out_trade_no"] = parmas["outtradeno"]; parms["subject"] = subject; parms["body"] = body; parms["total_fee"] = totalFee; parms.Add("notify_url", notifyUrl); parms.Add("payment_type", paymentType); parms.Add("it_b_pay", "30m"); string sign = AlipayRSAFromPkcs8.sign(AlipayCore.CreateLinkString(AlipayCore.FilterPara(parms)), AlipayConfig.PrivateKey, AlipayConfig.AppInputCharset); parms.Add("sign", HttpUtility.UrlEncode(sign, e)); parms.Add("sign_type", AlipayConfig.AppSignType); Dictionary <string, string> dicArray = new Dictionary <string, string>(); foreach (KeyValuePair <string, string> temp in parms) { dicArray.Add(temp.Key, temp.Value); } //记录充值信息 RechargeModel rech = new RechargeModel { Out_trade_no = outTradeNo, Account = parmas["account"], SuiteId = parmas["vossuiteid"], PlatForm = "支付宝", Type = int.Parse(parmas["type"]), Role = int.Parse(parmas["role"]) }; bool addres = Recharge.AddRecharge(rech); if (!addres) { return(AjaxResult("error", "记录充值信息失败")); } string content = JsonHelper.StringDicToJson(dicArray); return(AjaxResult("success", content, true)); }
/// <summary> /// 支付 /// </summary> public ActionResult Pay() { //订单id int oid = WebHelper.GetQueryInt("oid"); //订单信息 OrderInfo orderInfo = Orders.GetOrderByOid(oid); if (orderInfo == null || orderInfo.OrderState != (int)OrderState.WaitPaying) { return(Content("")); } //支付类型,必填,不能修改 string paymentType = "1"; //服务器异步通知页面路径,需http://格式的完整路径,不能加?id=123这类自定义参数 string notifyUrl = string.Format("http://{0}/app/alipay/notify", BSPConfig.ShopConfig.SiteUrl); //收款支付宝帐户 string sellerEmail = AlipayConfig.Seller; //合作者身份ID string partner = AlipayConfig.Partner; //交易安全检验码 string key = AlipayConfig.Key; //商户订单号 string outTradeNo = orderInfo.Oid.ToString() + Randoms.CreateRandomValue(10, false); //订单名称 string subject = BSPConfig.ShopConfig.SiteTitle + "购物"; //付款金额 string totalFee = orderInfo.SurplusMoney.ToString(); //订单描述 string body = "订单编号为:" + orderInfo.OSN; Encoding e = Encoding.GetEncoding(AlipayConfig.AppInputCharset); //把请求参数打包成数组 SortedDictionary <string, string> parms = new SortedDictionary <string, string>(); parms.Add("partner", partner); parms.Add("seller_id", sellerEmail); parms.Add("out_trade_no", outTradeNo); parms.Add("subject", subject); parms.Add("body", body); parms.Add("total_fee", totalFee); parms.Add("notify_url", notifyUrl); parms.Add("service", "mobile.securitypay.pay"); parms.Add("payment_type", paymentType); parms.Add("_input_charset", AlipayConfig.AppInputCharset); parms.Add("it_b_pay", "30m"); parms.Add("show_url", "m.alipay.com"); string sign = AlipayRSAFromPkcs8.sign(AlipayCore.CreateLinkString(AlipayCore.FilterPara(parms)), AlipayConfig.PrivateKey, AlipayConfig.AppInputCharset); parms.Add("sign", HttpUtility.UrlEncode(sign, e)); parms.Add("sign_type", AlipayConfig.AppSignType); Dictionary <string, string> dicArray = new Dictionary <string, string>(); foreach (KeyValuePair <string, string> temp in parms) { dicArray.Add(temp.Key, temp.Value); } string content = AlipayCore.CreateLinkString(dicArray); return(Content("{ \"orderString\":\"" + content + "\" }")); }