/// <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); }
/// <summary> /// 扫码支付 /// </summary> /// <param name="dto"></param> /// <returns></returns> public OrderPayResult OrderPay(OrderPayDTO dto) { OrderPayResult result = new OrderPayResult(); try { AlipayTradeBarcodeDTO barcodeDto = new AlipayTradeBarcodeDTO(); barcodeDto.out_trade_no = dto.OutTradeNo; barcodeDto.operator_id = dto.OperatorId; barcodeDto.auth_code = dto.AuthCode; barcodeDto.scene = "bar_code"; barcodeDto.total_amount = dto.TotalAmount; barcodeDto.subject = dto.Title; barcodeDto.body = dto.Body; barcodeDto.store_id = dto.StoreId; barcodeDto.terminal_id = dto.TerminalId; barcodeDto.timeout_express = "30m";//限制30分钟内完成付款 AlipayTradePayRequest payRequest = new AlipayTradePayRequest(); payRequest.BizContent = barcodeDto.BuildJson(); AlipayTradePayResponse payResponse = Execute(payRequest); if (payResponse != null) { switch (payResponse.Code) { case ResultCode.SUCCESS: break; //返回支付处理中,需要进行轮询 case ResultCode.INRROCESS: AlipayTradeQueryResponse queryResponse = LoopQuery(barcodeDto.out_trade_no, 10, 3000); //用订单号trade_no进行轮询也是可以的。 //轮询结束后还是支付处理中,需要调撤销接口 if (queryResponse != null) { if (queryResponse.TradeStatus == TradeStatus.WAIT_BUYER_PAY) { CancelAndRetry(barcodeDto.out_trade_no); queryResponse.TradeStatus = TradeStatus.TRADE_CLOSED; queryResponse.SubMsg = payResponse.SubMsg + "(等待时间过长,已经撤销支付订单)"; } payResponse = toTradePayResponse(queryResponse); } break; //明确返回业务失败 case ResultCode.FAIL: break; //返回系统异常,需要调用一次查询接口,没有返回支付成功的话调用撤销接口撤销交易 case ResultCode.ERROR: AlipayTradeQueryResponse queryResponse2 = sendTradeQuery(barcodeDto.out_trade_no); if (queryResponse2 != null) { if (queryResponse2.TradeStatus == TradeStatus.WAIT_BUYER_PAY) { AlipayTradeCancelResponse cancelResponse = CancelAndRetry(barcodeDto.out_trade_no); queryResponse2.TradeStatus = TradeStatus.TRADE_CLOSED; queryResponse2.SubMsg = queryResponse2.SubMsg + "(等待时间过长,已经撤销支付订单)"; } payResponse = toTradePayResponse(queryResponse2); } break; default: break; } result.SetAlipayResult(payResponse); return(result); } else { AlipayTradeQueryResponse queryResponse3 = sendTradeQuery(barcodeDto.out_trade_no); if (queryResponse3 != null) { if (queryResponse3.TradeStatus == TradeStatus.WAIT_BUYER_PAY) { AlipayTradeCancelResponse cancelResponse = CancelAndRetry(barcodeDto.out_trade_no); queryResponse3.TradeStatus = TradeStatus.TRADE_CLOSED; queryResponse3.SubMsg = queryResponse3.SubMsg + "(等待时间过长,已经撤销支付订单)"; } payResponse = toTradePayResponse(queryResponse3); } result.SetAlipayResult(payResponse); return(result); } } catch (Exception e) { throw new F2FPayException(e.Message, e); } }