Beispiel #1
0
        /// <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);
        }
Beispiel #2
0
        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)
                {
                    /** !!!!!!!注意!!!!!!!!
                     * 处理到最后一次,还是未撤销成功,需要在商户数据库中对此单最标记,人工介入处理*/
                }
            }
        }
Beispiel #3
0
        /// <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);
        }
Beispiel #4
0
        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);
        }
Beispiel #5
0
        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");
        }
Beispiel #7
0
 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);
     }
 }
Beispiel #8
0
        /// <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);
        }
Beispiel #9
0
        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);
        }
Beispiel #11
0
        /// <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);
        }
Beispiel #13
0
        /// <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));
                }
            }
        }
Beispiel #14
0
 /// <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);
     }
 }
Beispiel #15
0
 // 交易关闭
 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);
 }
Beispiel #16
0
        /// <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);
            }
        }
Beispiel #17
0
        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);
            }
        }
Beispiel #18
0
        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();
        }
Beispiel #19
0
        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();
        }