您的位置:首页 > 移动开发 > 微信开发

微信扫码支付回调操作

2016-12-26 18:12 381 查看
微信扫码支付回调可以分为两个部分(特别说明,本文所涉及的方法是直接调用微信SDK,所贴的代码只是处理业务的方法。),微信SDKX下载地址

1、轮询订单状态

      轮询订单状态就是时刻监听用户的支付状态,比如扫码成功,支付成功等状态。具体状态说详见微信支付订单查询接口文档说明。这里我就简单的说下我实现的逻辑

   

// / <summary>
/// 查询订单状态
/// </summary>
/// <param name="orderId"></param>
/// <returns></returns>
public JsonResult GetStatus(string orderId)
{

LogHelper.AddLog("OrderController.GetStatus  微信扫码支付  开始进入 orderID:" + orderId);

string msg;
KKTJ.WxPay.WxHelper.DD_JYJLBTool tool = new KKTJ.WxPay.WxHelper.DD_JYJLBTool();

Entity.DD_JYJLB mod = tool.GetNewEntiyByDDID(orderId);

KKTJ.WxPay.WxHelper.WxPayData result = KKTJ.WxPay.WxHelper.OrderQuery.Run("", mod.JYJLBH);// "D201601291827160001");

LogHelper.AddLog("OrderController.GetStatus   交易流水号:" + mod.JYJLBH);

string return_code = result.GetValue("return_code").ToString();//当返回状态return_code为SUCCESS,才会有数据返回。
string result_code = result.GetValue("result_code").ToString();
string total_fee = result.GetValue("total_fee") == null ? "" : result.GetValue("total_fee").ToString();//微信返回金额
if (return_code == "SUCCESS" && result_code == "SUCCESS") //当返回状态return_code和result_code为SUCCESS,才会有数据回。
{
#region ===判断支付状态====
try
{
LogHelper.AddLog("OrderController.GetStatus  return_code == SUCCESS && result_code == SUCCESS 交易流水号:" + mod.JYJLBH);

string resultState = result.GetValue("trade_state").ToString();

LogHelper.AddLog("OrderController.GetStatus trade_state " + resultState);

if (resultState == "SUCCESS")
{
//处理你的业务逻辑
}

return Json(new { flag = true, returnValue = model_jb.DDLY, returnMsg = "SUCCESS" });

#endregion

}
}

}
}
catch (Exception ex)
{
LogHelper.AddErrorLog("GetStatus():" + ex.Message + "报错行数:" + ex.StackTrace + ex.ToString());
return Json(new { flag = false, returnValue = "FAIL", returnMsg = "失败" });

}
#endregion
}

return Json(new { flag = false, returnValue = "FAIL", returnMsg = "失败" });
}
/***
* 订单查询完整业务流程逻辑
* @param transaction_id 微信订单号(优先使用)
* @param out_trade_no 商户订单号
* @return 订单查询结果(xml格式)
*/
public static WxPayData Run(string transaction_id, string out_trade_no)
{

WxPayData data = new WxPayData();
if (!string.IsNullOrEmpty(transaction_id))//如果微信订单号存在,则以微信订单号为准
{
data.SetValue("transaction_id", transaction_id);
}
else//微信订单号不存在,才根据商户订单号去查单
{
data.SetValue("out_trade_no", out_trade_no);
}

WxPayData result = WxPayApi.OrderQuery(data);//提交订单查询请求给API,接收返回数据
return result;
}


2、微信异步通知

微信异步通知,当用户支付成功,微信请求异步通知地址,返回处理结果。

/// <summary>
/// 微信支付通知
/// </summary>
/// <returns></returns>
public ActionResult WeiXinNotify()
{
ResultNotify resultNotify = new ResultNotify(this);
string str = resultNotify.ProcessNotify();
return Content(str);
}


public override string ProcessNotify()
{
//LogHelper.AddErrorLog("微信异步回调页面开始,ProcessNotify");
WxPayData notifyData = GetNotifyData();
string strReturn = string.Empty;
//检查支付结果中transaction_id是否存在
if (!notifyData.IsSet("transaction_id"))
{
//若transaction_id不存在,则立即返回结果给微信支付后台
WxPayData res = new WxPayData();
res.SetValue("return_code", "FAIL");
res.SetValue("return_msg", "支付结果中微信订单号不存在");
Log.Error(this.GetType().ToString(), "The Pay result is error : " + res.ToXml());
strReturn = res.ToXml();
//page.Response.Write(res.ToXml());
//page.Response.End();
}

string transaction_id = notifyData.GetValue("transaction_id").ToString();

//查询订单,判断订单真实性
if (!QueryOrder(transaction_id))
{

//若订单查询失败,则立即返回结果给微信支付后台
WxPayData res = new WxPayData();
res.SetValue("return_code", "FAIL");
res.SetValue("return_msg", "订单查询失败");
Log.Error(this.GetType().ToString(), "Order query failure : " + res.ToXml());
strReturn = res.ToXml();
//page.Response.Write(res.ToXml());
//page.Response.End();
}
//查询订单成功
else
{
//LogHelper.AddErrorLog("订单支付成功");
WxPayData res = new WxPayData();
try
{
//处理你的业务逻辑

}
catch
{
res.SetValue("return_code", "FAIL");
res.SetValue("return_msg", "订单查询失败");
Log.Error(this.GetType().ToString(), "Order query failure : " + res.ToXml());
}
}
//LogHelper.AddErrorLog("微信异步回调页面结束");
return strReturn;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  微信 支付