今天写小程序的支付接口,参照的当然是微信支付API了
有那么多时间写文字,不如多写点代码~😄
下面只想记录下实现的过程及最重要的代码处理。
步骤一:小程序获取,opendid与orderid,传入下面第二部的“统一下单接口”中

接口:统一下单接口
//接口部分,怎么组装你自己想咯,太懒是不行的
public APIResult<UnifiedOrderResult> Prepay(PrepayParam prepayParam)
{
string openId = CryptoProvider.NetDecrypt(prepayParam.openId, LiteMallDefaults.Key);//此设备号是由小程序OpenId加密而成的
var order = _orderService.GetOrderById(prepayParam.orderId);
var key = _weiXinPaySettings.KEY;//商户后台API安全的KEY值(手动设定的)
var appid = _weiXinPaySettings.APPID;//微信支付分配的小程序ID
var mch_id = _weiXinPaySettings.MCHID;//微信支付分配的商户号
var nonce_str = Guid.NewGuid().ToString().Replace("-", "");// 随机字符串,长度要求在32位以内
var body = _storeContext.CurrentStore.Name;//商品简单描述,该字段请按照规范传递,具体请见参数规定
var attach = order.Id.ToString();//附加数据(这里传递订单号,以便后续异步通知同步商户信息)
var out_trade_no = order.CustomOrderNumber;//商户系统内部订单号,要求32个字符内、且在同一个商户号下唯一。
//var total_fee = Math.Round(order.OrderTotal * 100, 0).ToString();
var total_fee = 1;
var spbill_create_ip = "8.8.8.8";//DEMO 默认值,不能为空
if (!string.IsNullOrEmpty(_weiXinPaySettings.IP))
{
spbill_create_ip = _weiXinPaySettings.IP;
}
var time_start = DateTime.Now.ToString("yyyyMMddHHmmss");// 订单生成时间,格式为yyyyMMddHHmmss,如2009年12月25日9点10分10秒表示为20091225091010。其他详见时间规则
var time_expire = DateTime.Now.AddMinutes(30).ToString("yyyyMMddHHmmss");//订单失效时间,格式为yyyyMMddHHmmss,如2009年12月27日9点10分10秒表示为20091227091010。其他详见
var trade_type = "JSAPI"; //固定值
var product_id = order.Id.ToString();//商品ID
var notify_url = _storeContext.CurrentStore.Url + "Plugins/PaymentWeiXinPay/PayNotify";//回调地址(请按照路由的设定填写,请确保路径正确)
//参数
//特别说明:SortedDictionary自身就会自动排除,所以后续就没有在手动进行排序操作
//否则的话,你可能需要手动按照规则进行排序哦!
SortedDictionary<string, object> para = new SortedDictionary<string, object>();
para.Add("appid", appid);
para.Add("mch_id", mch_id);
para.Add("nonce_str", nonce_str);
para.Add("body", body);
para.Add("attach", attach);
para.Add("out_trade_no", out_trade_no);
para.Add("openid", openId);
para.Add("total_fee", total_fee);
para.Add("spbill_create_ip", spbill_create_ip);
para.Add("time_start", time_start);
para.Add("time_expire", time_expire);
para.Add("trade_type", trade_type);
para.Add("product_id", product_id);
para.Add("notify_url", notify_url);
//获取签名:参数 + key 值
var sign = WeChatHelper.MakeSign(para, key);
//将签名加入集合中
para.Add("sign", sign);
//重新排序并生成接口需要的XML格式数据
string xml = WeChatHelper.ToXml(para);
//调用统一下单接口
var post = new RemotePostXml
{
FormName = "weixinpaysubmit",
Url = "https://api.mch.weixin.qq.com/pay/unifiedorder",
Method = "POST",
XmlParamsString = xml
};
var postResult = post.Post();
//接收微信服务器返回的XML数据,并转成字典方便操作
SortedDictionary<string, object> resultSorteDictioinary = WeChatHelper.FromXml(postResult, para);
//为支付接口准备数据
string AppId = appid;
string TimeStamp = WeChatHelper.GetTimeStamp();//获取时间戳
string nonceStr = Guid.NewGuid().ToString().Replace("-", "");
string prepayid = WeChatHelper.GetValue(resultSorteDictioinary, "prepay_id").ToString();
string package = "prepay_id=" + prepayid;
string signType = "MD5";
//sign签名需要的数据
SortedDictionary<string, object> pay_sign_para = new SortedDictionary<string, object>();
pay_sign_para.Add("appId", appid);
pay_sign_para.Add("timeStamp", TimeStamp);
pay_sign_para.Add("nonceStr", nonceStr);
pay_sign_para.Add("package", package);
pay_sign_para.Add("signType", signType);
//var pay_sign = WeChatHelper.GetMD5(WeChatHelper.ToUrl(pay_sign_para) + "&" + key);
var pay_sign = WeChatHelper.MakeSign(pay_sign_para, key);
pay_sign_para.Add("sign", pay_sign);
UnifiedOrderResult unifiedOrderResult = new UnifiedOrderResult()
{
timeStamp = TimeStamp,
nonceStr = nonceStr,
packageValue = package,
signType = signType,
paySign = pay_sign
};
return Success(unifiedOrderResult, "");
}
到这里,就会弹出支付窗体啦!完成支付后,你不是要点击“完成支付”吗?这个动作还要对应一个回调地址来处理系统的订单,例如:标记为已经完成支付
/// <summary>
/// 微信支付通知
/// </summary>
/// <param name="form"></param>
/// <returns></returns>
public ActionResult PayNotify()
{
//获取微信返回的xml字符串数据
Stream stream = HttpContext.Request.Body;
byte[] buffer = new byte[HttpContext.Request.ContentLength.Value];
stream.Read(buffer, 0, buffer.Length);
string contentXml = Encoding.UTF8.GetString(buffer);//格式:xml字符串
_logger.InsertLog(LogLevel.Debug, "异步结果通知:" + contentXml);
//将XML数据转为字典(方便操作)
SortedDictionary<string, object> data = new SortedDictionary<string, object>();
data = FromXml(contentXml.ToString(), data);
var return_code = GetValue(data, "return_code");
var return_msg = GetValue(data, "return_msg");
//异常时结果集合:更多可能的异常,补充处理
SortedDictionary<string, object> resultDict = new SortedDictionary<string, object>();
if (return_code != null)
resultDict.Add("return_code", return_code);
if (return_msg != null)
resultDict.Add("return_msg", return_msg);
if (return_code != null && return_code.ToString().ToUpper() != "SUCCESS")
{
_logger.InsertLog(LogLevel.Debug, "异步结果通知:失败");
//失败的情况
return Content(ToXml(resultDict));
}
#region 自身系统订单处理
//交易号transaction_id订单查询
SortedDictionary<string, object> orderQueryRequest = new SortedDictionary<string, object>();
var transactionId = GetValue(data, "transaction_id");
if (transactionId != null)
{
orderQueryRequest.Add("transaction_id", transactionId);
}
//查询微信订单
var orderQueryResult = OrderQuery(orderQueryRequest);
//根据微信订单状态判断
if (GetValue(data, "return_code") != null &&
GetValue(data, "result_code") != null &&
GetValue(data, "return_code").ToString() == "SUCCESS" &&
GetValue(data, "result_code").ToString() == "SUCCESS")
{
_logger.InsertLog(LogLevel.Debug, "异步结果通知:已查询到微信支付订单信息");
#region 订单操作
//获取交易号
var strOrderCustomNumber = GetValue(data, "out_trade_no");//这里下单时传递的是订单的GUID号,不是订单ID编号
if (strOrderCustomNumber != null)
{
if (!string.IsNullOrEmpty(strOrderCustomNumber.ToString()))
{
_logger.InsertLog(LogLevel.Debug, "异步结果通知:订单获取成功,准备修改订单信息:自定义的订单号:"+ strOrderCustomNumber);
//获取订单信息
var order = _orderService.GetOrderByGuid(new Guid(strOrderCustomNumber.ToString()));
//设定订单为已经支付
if (order == null)
{
_logger.InsertLog(LogLevel.Debug, "异步结果通知==订单状态修改失败,没有获取到系统的订单信息");
return Content(ToXml(resultDict));
}
else if (order != null)
{
if (_orderProcessingService.CanMarkOrderAsPaid(order))
{
_logger.InsertLog(LogLevel.Debug, "允许修改订单为已经支付");
_orderProcessingService.MarkOrderAsPaid(order);
_logger.InsertLog(LogLevel.Debug, "异步结果通知==订单状态已修改为【已支付】");
}
else
{
_logger.InsertLog(LogLevel.Debug, "允许修改订单为已经支付");
}
}
//_logger.InsertLog(LogLevel.Debug, "异步结果通知==修改订单时,出现其他未知情况");
}
else
{
_logger.InsertLog(LogLevel.Debug, "异步结果通知==订单号异常");
}
}
else
{
_logger.InsertLog(LogLevel.Debug, "异步结果通知==订单号异常");
}
#endregion
}
else
{
//若订单查询失败
resultDict.Add("return_code", "FAIL");
resultDict.Add("return_msg", "FAIL");
return Content(ToXml(resultDict));
}
#endregion
_logger.InsertLog(LogLevel.Debug, "反馈的结果:"+ ToXml(resultDict));
return Content(ToXml(resultDict));
}
就此,微信支付及系统订单的处理过程就完成了。
不要问我要完整的代码了(实在不会,找我是会帮忙的,免费是不可能滴,( ̄▽ ̄)")
NopCommerce3.x以上版本处理方式一毛一样。不会有太大区别
=============================================================
找我吗
QQ:64664795 (备注:博客园)