/// <summary> /// 扫码支付 /// </summary> /// <param name="dto"></param> /// <returns></returns> public OrderPayResult OrderPay(OrderPayDTO dto) { WeixinDataHelper data = new WeixinDataHelper(this._weixinKey); data.SetValue("auth_code", dto.AuthCode); //授权码 data.SetValue("body", dto.Body); //商品描述 data.SetValue("total_fee", int.Parse(((Convert.ToDouble(dto.TotalAmount)) * 100).ToString())); //总金额 data.SetValue("out_trade_no", dto.OutTradeNo); //产生随机的商户订单号 data.SetValue("spbill_create_ip", dto.TerminalId); //终端ip WeixinDataHelper response = weixinPayApi.Micropay(data, 10); //提交被扫支付,接收返回结果 var result = new OrderPayResult(); //如果提交被扫支付接口调用失败,则抛异常 if (!response.IsSet("return_code") || response.GetValue("return_code").ToString() == "FAIL") { result.SetWeixiResult(response); return(result); //string returnMsg = response.IsSet("return_msg") ? response.GetValue("return_msg").ToString() : ""; //throw new F2FPayException("Micropay API interface call failure, return_msg : " + returnMsg); } //签名验证 response.CheckSign(); //刷卡支付直接成功 if (response.GetValue("return_code").ToString() == "SUCCESS" && response.GetValue("result_code").ToString() == "SUCCESS") { result.SetWeixiResult(response); return(result); } /****************************************************************** * 剩下的都是接口调用成功,业务失败的情况 * ****************************************************************/ //1)业务结果明确失败 if (response.GetValue("err_code").ToString() != "USERPAYING" && response.GetValue("err_code").ToString() != "SYSTEMERROR") { result.SetWeixiResult(response); return(result); } //2)不能确定是否失败,需查单 //用商户订单号去查单 string out_trade_no = data.GetValue("out_trade_no").ToString(); //确认支付是否成功,每隔一段时间查询一次订单,共查询10次 int queryTimes = 10;//查询次数计数器 while (queryTimes-- > 0) { int succResult = 0;//查询结果 WeixinDataHelper queryResult = Query(out_trade_no, out succResult); //如果需要继续查询,则等待2s后继续 if (succResult == 2) { Thread.Sleep(2000); continue; } //查询成功,返回订单查询接口返回的数据 else if (succResult == 1) { result.SetWeixiResult(queryResult); return(result); } //订单交易失败,直接返回刷卡支付接口返回的结果,失败原因会在err_code中描述 else { result.SetWeixiResult(response); return(result); } } //确认失败,则撤销订单 if (!Cancel(out_trade_no)) { throw new WeixinPayException("撤销订单失败!"); } var errmsg = response.GetValue("err_code_des"); response.SetValue("err_code_des", errmsg + "(已自动完成了撤销订单)"); result.SetWeixiResult(response); return(result); }