/// <summary> /// 交易撤销 /// </summary> public bool Cancel(string orderNo, string tradeNo = null) { bool success = false; var model = new AlipayTradeCancelModel() { OutTradeNo = orderNo, TradeNo = tradeNo }; var request = new AlipayTradeCancelRequest(); request.SetBizModel(model); AlipayTradeCancelResponse response = aopClient.Execute(request); if (response != null && response.Code == "10000") { success = true; //response.RetryFlag 是否需要重试,Y / N //response.Action 本次撤销触发的交易动作 close:关闭交易,无退款; refund:产生了退款 } return(success); }
private void cancelThreadFunc(object o) { int RETRYCOUNT = 10; int INTERVAL = 10000; for (int i = 0; i < RETRYCOUNT; ++i) { Thread.Sleep(INTERVAL); AlipayTradeCancelRequest cancelRequest = new AlipayTradeCancelRequest(); string outTradeNo = o.ToString(); AlipayTradeCancelResponse cancelResponse = tradeCancel(outTradeNo); if (null != cancelResponse) { if (cancelResponse.Code == ResultCode.FAIL) { if (cancelResponse.RetryFlag == "N") { break; } } if ((cancelResponse.Code == ResultCode.SUCCESS)) { break; } } if (i == RETRYCOUNT - 1) { /** !!!!!!!注意!!!!!!!! * 处理到最后一次,还是未撤销成功,需要在商户数据库中对此单最标记,人工介入处理*/ } } }
/// <summary> /// 取消订单接口 /// </summary> /// <param name="biz_content"></param> /// <returns></returns> private AlipayTradeCancelResponse Cancel(string biz_content) { LogHelper.AlipayLog(string.Format("正在取消订单")); AlipayTradeCancelRequest cancelRequest = new AlipayTradeCancelRequest(); cancelRequest.BizContent = biz_content; AlipayTradeCancelResponse cancelResponse = client.Execute(cancelRequest); if (null != cancelResponse) { if (cancelResponse.Code == ResultCode.FAIL && cancelResponse.RetryFlag == "Y") { //if (cancelResponse.Body.Contains("\"retry_flag\":\"Y\"")) //cancelOrderRetry(biz_content); // 新开一个线程重试撤销 ParameterizedThreadStart ParStart = new ParameterizedThreadStart(cancelOrderRetry); Thread myThread = new Thread(ParStart); object o = biz_content; myThread.Start(o); LogHelper.AlipayLog(string.Format("取消-结果:{0}-{1}", cancelResponse.Code, cancelResponse.Body)); } if (cancelResponse.Code == ResultCode.SUCCESS) { //lblMessage.Text = cancelResponse.Body; LogHelper.AlipayLog(string.Format("取消-结果:{0}", cancelResponse.Code)); } } return(cancelResponse); }
public AlipayTradeCancelResponse Cancel(string OutTradeNo) { List <StrPair> list = new List <StrPair>() { new StrPair("out_trade_no", OutTradeNo) }; string content = List2Json(list); AlipayTradeCancelRequest cancelRequest = new AlipayTradeCancelRequest(); cancelRequest.BizContent = content; AlipayTradeCancelResponse cancelResponse = m_Client.Execute(cancelRequest); if (null != cancelResponse) { if (cancelResponse.Code == ResultCode.FAIL && cancelResponse.RetryFlag == "Y") { //if (cancelResponse.Body.Contains("\"retry_flag\":\"Y\"")) //cancelOrderRetry(biz_content); // 新开一个线程重试撤销 ParameterizedThreadStart ParStart = new ParameterizedThreadStart(cancelOrderRetry); Thread myThread = new Thread(ParStart); object o = content; myThread.Start(o); } } return(cancelResponse); }
public void cancelOrderRetry(object o) { int retryCount = 10; for (int i = 0; i < retryCount; ++i) { Thread.Sleep(5000); AlipayTradeCancelRequest cancelRequest = new AlipayTradeCancelRequest(); cancelRequest.BizContent = o.ToString(); Dictionary <string, string> paramsDict = (Dictionary <string, string>)cancelRequest.GetParameters(); AlipayTradeCancelResponse cancelResponse = m_Client.Execute(cancelRequest); if (null != cancelResponse) { if (cancelResponse.Code == ResultCode.FAIL) { //if (cancelResponse.Body.Contains("\"retry_flag\":\"N\"")) if (cancelResponse.RetryFlag == "N") // 再重試也不會成功 { break; } } if ((cancelResponse.Code == ResultCode.SUCCESS)) { break; } } if (i == retryCount - 1) { // 处理到最后一次,还是未撤销成功,需要在商户数据库中对此单最标记,人工介入处理 } } }
public void TestCancel() { AlipayTradeCancelResponse response = Factory.Payment.Common().Cancel(CreateNewAndReturnOutTradeNo()); Assert.AreEqual(response.Code, "10000"); Assert.AreEqual(response.Msg, "Success"); Assert.Null(response.SubCode); Assert.Null(response.SubMsg); Assert.NotNull(response.HttpBody); Assert.AreEqual(response.Action, "close"); }
private AlipayTradeCancelResponse tradeCancel(string outTradeNo) { try { AlipayTradeCancelRequest request = new AlipayTradeCancelRequest(); StringBuilder sb2 = new StringBuilder(); sb2.Append("{\"out_trade_no\":\"" + outTradeNo + "\"}"); request.BizContent = sb2.ToString(); AlipayTradeCancelResponse response = client.Execute(request); return(response); } catch { return(null); } }
/// <summary> /// 撤销订单 /// </summary> /// <param name="out_trade_no"></param> /// <returns></returns> private AlipayTradeCancelResponse CancelAndRetry(string out_trade_no) { AlipayTradeCancelResponse cancelResponse = null; cancelResponse = tradeCancel(out_trade_no); //如果撤销失败,新开一个线程重试撤销,不影响主业务 if (cancelResponse == null || (cancelResponse.Code == ResultCode.FAIL && cancelResponse.RetryFlag == "Y")) { ParameterizedThreadStart ParStart = new ParameterizedThreadStart(cancelThreadFunc); Thread myThread = new Thread(ParStart); object o = out_trade_no; myThread.Start(o); } return(cancelResponse); }
public Result CancelPreOrder(string account, string orderNo) { Result result = new Result(); try { result.IsOK = true; IAlipayTradeService serviceClient = F2FBiz.CreateClientInstance(Config.serverUrl, Config.appId, Config.merchant_private_key, Config.version, Config.sign_type, Config.alipay_public_key, Config.charset); AlipayF2FQueryResult queryResult = serviceClient.tradeQuery(orderNo); if (queryResult != null) { if (queryResult.Status == ResultEnum.SUCCESS) { result = Common.Common.UpdateOrderTB(account, orderNo); if (!result.IsOK) { return(result); } result.Description = "用户已付款"; result.StateCodeID = 0; } else { //防止扫码之后退出续期 AlipayTradeCancelResponse cancelResult = serviceClient.tradeCancelResponse(orderNo); if (cancelResult.Action == "close") { result = Common.Common.DelectOrderTB(account, orderNo); if (!result.IsOK) { return(result); } result.Description = "取消订单成功"; result.StateCodeID = 1; } } } } catch (Exception ex) { LogHelper.WriteLog(GetType()).Info(ex.StackTrace); result.IsOK = false; result.Description = ex.Message; } return(result); }
private AlipayTradeCancelResponse Cancel(string biz_content) { AlipayTradeCancelRequest cancelRequest = new AlipayTradeCancelRequest(); cancelRequest.BizContent = biz_content; AlipayTradeCancelResponse cancelResponse = client.Execute(cancelRequest); if (null != cancelResponse) { if (cancelResponse.Code == qrcode._2.ResultCode.FAIL && cancelResponse.RetryFlag == "Y") { for (int i = 0; i < retryCount; ++i) { Thread.Sleep(3000); cancelResponse = client.Execute(cancelRequest); if (null != cancelResponse) { if (cancelResponse.Code == qrcode._2.ResultCode.FAIL) { //if (cancelResponse.Body.Contains("\"retry_flag\":\"N\"")) if (cancelResponse.RetryFlag == "N") { break; } } if ((cancelResponse.Code == qrcode._2.ResultCode.SUCCESS)) { break; } } if (i == retryCount - 1) { throw new Exception("撤销订单失败!"); } } } } return(cancelResponse); }
/// <summary> /// 订单撤销 /// </summary> /// <param name="queryRequset">请求内容</param> /// <returns></returns> public static CancelResponseModel Cancel(CancelModel requestModel) { AlipayTradeCancelRequest cancelRequst = new AlipayTradeCancelRequest(); cancelRequst.BizContent = JsonConvert.SerializeObject(requestModel); LogUtil.WriteAlipayLog("订单撤销请求", "请求参数", cancelRequst.BizContent); Dictionary <string, string> paramsDict = (Dictionary <string, string>)cancelRequst.GetParameters(); AlipayTradeCancelResponse cancelResponse = _client.Execute(cancelRequst); LogUtil.WriteAlipayLog("撤销订单响应", "响应参数", cancelResponse.Body); return(new CancelResponseModel { msg = cancelResponse.Msg, code = cancelResponse.Code, subcode = cancelResponse.SubCode, submsg = cancelResponse.SubMsg, action = cancelResponse.Action, out_trade_no = cancelResponse.OutTradeNo, retry_flag = cancelResponse.RetryFlag, trade_no = cancelResponse.TradeNo }); }
private AlipayTradeCancelResponse Cancel(string biz_content) { AlipayTradeCancelRequest cancelRequest = new AlipayTradeCancelRequest(); cancelRequest.BizContent = biz_content; AlipayTradeCancelResponse cancelResponse = client.Execute(cancelRequest); if (null != cancelResponse) { if (cancelResponse.Code == qrcode._2.ResultCode.FAIL && cancelResponse.RetryFlag == "Y") { //if (cancelResponse.Body.Contains("\"retry_flag\":\"Y\"")) //cancelOrderRetry(biz_content); // 新开一个线程重试撤销 ParameterizedThreadStart ParStart = new ParameterizedThreadStart(cancelOrderRetry); Thread myThread = new Thread(ParStart); object o = biz_content; myThread.Start(o); } } return(cancelResponse); }
/// <summary> /// 取消订单方法 /// </summary> /// <param name="o"></param> public void cancelOrderRetry(object o) { int retryCount = 50; for (int i = 0; i < retryCount; ++i) { Thread.Sleep(10000); AlipayTradeCancelRequest cancelRequest = new AlipayTradeCancelRequest(); cancelRequest.BizContent = o.ToString(); // Dictionary<string, string> paramsDict = (Dictionary<string, string>)cancelRequest.GetParameters(); AlipayTradeCancelResponse cancelResponse = client.Execute(cancelRequest); if (null != cancelResponse) { if (cancelResponse.Code == ResultCode.FAIL) { LogHelper.AlipayLog(string.Format("取消-结果:{0},请求内容:{1}", cancelResponse.Code, o)); if (cancelResponse.RetryFlag == "N") { break; } } if ((cancelResponse.Code == ResultCode.SUCCESS)) { LogHelper.AlipayLog(string.Format("取消-结果:{0}", cancelResponse.Code)); break; } } if (i == retryCount - 1) { // 处理到最后一次,还是未撤销成功,需要在商户数据库中对此单最标记,人工介入处理 //lblMessage.Text = cancelResponse.Body; LogHelper.AlipayLog(string.Format("处理到最后一次,还是未撤销成功,需要在商户数据库中对此单最标记,人工介入处理,请求内容:{0}", o)); } } }
/// <summary> /// 统一收单交易撤销接口 /// 支付交易返回失败或支付系统超时,调用该接口撤销交易。如果此订单用户支付失败,支付宝系统会将此订单关闭;如果用户支付成功,支付宝系统会将此订单资金退还给用户 /// </summary> /// <param name="out_trade_no">支付宝订单号</param> /// <param name="trade_no">平台编号</param> /// <returns></returns> public static bool CancelOrder(string companyId, string out_trade_no, string trade_no) { try { AlipayTradeCancelRequest request = new AlipayTradeCancelRequest(); request.BizContent = "{" + "\"out_trade_no\":\"" + out_trade_no + "\"," + "\"trade_no\":\"" + trade_no + "\"" + "}"; AlipayTradeCancelResponse response = GetDefaultAopClient(companyId).Execute(request); if (response.IsError) { TxtLogServices.WriteTxtLogEx("AliPayApiServices", string.Format("取消订单失败:{0}", response.Body)); return(false); } TxtLogServices.WriteTxtLogEx("AliPayApiServices", string.Format("取消订单结果:{0}", response.Body)); return(response.Code == "10000"); } catch (Exception ex) { TxtLogServices.WriteTxtLogEx("AliPayApiServices", string.Format("取消订单失败:{0}", ex.Message)); return(false); } }
// 交易关闭 public static bool TradeClose(string outTradeNo) { try { // 2. 发起API调用 AlipayTradeCancelResponse response = Factory.Payment.Common().Cancel(outTradeNo); // 3. 处理响应或异常 if ("10000".Equals(response.Code)) { Console.WriteLine("调用成功"); return(true); } else { Console.WriteLine("调用失败,原因:" + response.Msg + "," + response.SubMsg); } } catch (Exception ex) { Console.WriteLine("调用遭遇异常,原因:" + ex.Message); throw ex; } return(false); }
/// <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); } }
public AlipayF2FPayResult tradePay(AlipayTradePayContentBuilder builder) { AlipayF2FPayResult payResult = new AlipayF2FPayResult(); try { AlipayTradePayRequest payRequest = new AlipayTradePayRequest(); payRequest.BizContent = builder.BuildJson(); AlipayTradePayResponse payResponse = client.Execute(payRequest); //payRequest.SetBizModel(""); if (payResponse != null) { switch (payResponse.Code) { case ResultCode.SUCCESS: break; //返回支付处理中,需要进行轮询 case ResultCode.INRROCESS: AlipayTradeQueryResponse queryResponse = LoopQuery(builder.out_trade_no, 10, 3000); //用订单号trade_no进行轮询也是可以的。 //轮询结束后还是支付处理中,需要调撤销接口 if (queryResponse != null) { if (queryResponse.TradeStatus == "WAIT_BUYER_PAY") { CancelAndRetry(builder.out_trade_no); payResponse.Code = ResultCode.FAIL; } payResponse = toTradePayResponse(queryResponse); } break; //明确返回业务失败 case ResultCode.FAIL: break; //返回系统异常,需要调用一次查询接口,没有返回支付成功的话调用撤销接口撤销交易 case ResultCode.ERROR: AlipayTradeQueryResponse queryResponse2 = sendTradeQuery(builder.out_trade_no); if (queryResponse2 != null) { if (queryResponse2.TradeStatus == TradeStatus.WAIT_BUYER_PAY) { AlipayTradeCancelResponse cancelResponse = CancelAndRetry(builder.out_trade_no); payResponse.Code = ResultCode.FAIL; } payResponse = toTradePayResponse(queryResponse2); } break; default: payResult.response = payResponse; break; } payResult.response = payResponse; return(payResult); } else { AlipayTradeQueryResponse queryResponse3 = sendTradeQuery(builder.out_trade_no); if (queryResponse3 != null) { if (queryResponse3.TradeStatus == TradeStatus.WAIT_BUYER_PAY) { AlipayTradeCancelResponse cancelResponse = CancelAndRetry(builder.out_trade_no); payResponse.Code = ResultCode.FAIL; } payResponse = toTradePayResponse(queryResponse3); } payResult.response = payResponse; return(payResult); } //return payResult; } catch (Exception e) { AlipayTradePayResponse payResponse = new AlipayTradePayResponse(); payResponse.Code = ResultCode.FAIL; payResponse.Body = e.Message; payResult.response = payResponse; return(payResult); } }
private void btnCancel_Click(object sender, EventArgs e) { if (m_Canceled) { MessageBox.Show("本单已五次撤消没有成功, 将不印单无记录直接离开! 请记录客户手机帐单截屏含支付宝交易号,人工退款"); } else { Message("撤消本支付请求中... 單號<" + m_OutTradeNoStr + ">"); AlipayTradeCancelResponse cancelResponse = null; try { cancelResponse = m_Alipay.Cancel(m_OutTradeNoStr); } catch (System.Net.WebException wex) { Message(wex.Message); MessageBox.Show("发生网络错误, 无法连至支付宝服务器!"); goto Cancel; } catch (Exception ex) { Message(ex.Message); MessageBox.Show("发生错误!"); goto Cancel; } m_CancelRetryCount++; switch (cancelResponse.Code) { case ResultCode.SUCCESS: Message("支付撤銷成功! 交易号<" + cancelResponse.TradeNo + ">"); MessageBox.Show("本单撤销成功!"); m_Canceled = true; SaveToDB(m_OutTradeNoStr, "00000", "00000"); goto Cancel; case ResultCode.FAIL: Message("支付撤销失敗! <" + cancelResponse.Msg + ">"); Message(""); Message(cancelResponse.SubMsg); Message(""); if (m_CancelRetryCount >= 5) { MessageBox.Show("己经撤销5次失败,本单无法确定状态,将删单!"); m_Canceled = true; goto Cancel; } return; // 按五次,因m_Canceled=true;就直接離開 default: Message("不明原因, 撤销可能没有成功!"); if (m_CancelRetryCount > 5) { MessageBox.Show("己经撤销5次失败,本单无法确定状态,将删单!"); m_Canceled = true; goto Cancel; } return; } } Cancel: SaveToDB(m_OutTradeNoStr, "00000", "00000"); // 取消失敗,可能只有OutTradeNo,沒有TradeNo及OpenID等等, OpenID="00000"代表TradeNo存的是OutTradeNo this.DialogResult = DialogResult.Cancel; Close(); }
private void btnCancel_Click(object sender, EventArgs e) { if (m_Canceled) { MessageBox.Show("本单已五次撤消没有成功, 将直接离开! 请记录客户手机帐单截屏含支付宝交易号,人工退款"); } else { AlipayTradeCancelResponse cancelResponse = null; try { if (m_TradeNoStr != null) { Message("撤消本支付请求中... 交易號<" + m_TradeNoStr + ">"); cancelResponse = m_Alipay.CancelByTradeNo(m_TradeNoStr); } else { Message("撤消本支付请求中... 單號<" + m_OutTradeNoStr + ">"); cancelResponse = m_Alipay.CancelByOutTradeNo(m_OutTradeNoStr); } m_CancelRetryCount++; } catch (System.Net.WebException wex) { Message(wex.Message); MessageBox.Show("发生网络错误, 无法连至支付宝服务器!"); this.DialogResult = DialogResult.Cancel; Close(); return; } catch (Exception ex) { Message(ex.Message); MessageBox.Show("发生错误!"); this.DialogResult = DialogResult.Cancel; Close(); return; } switch (cancelResponse.Code) { case ResultCode.SUCCESS: Message("支付撤消成功! 交易号<" + cancelResponse.TradeNo + ">"); m_Alipay.RefundedOrCanceled = true; m_Canceled = true; MessageBox.Show("本單撤消成功!"); break; case ResultCode.FAIL: Message("支付撤消失敗! <" + cancelResponse.Msg + ">"); Message(""); Message(cancelResponse.SubMsg); Message(""); if (m_CancelRetryCount >= 5) { m_Canceled = true; } return; // 按五次,因m_Canceled=true;就直接離開 default: Message("不明原因, 撤消可能沒有成功!"); if (m_CancelRetryCount > 5) { m_Canceled = true; } return; } } this.DialogResult = DialogResult.Cancel; Close(); }