Exemplo n.º 1
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);
            }
        }
Exemplo n.º 2
0
        /// <summary>
        /// 直接付款,适合条码支付
        /// </summary>
        /// <param name="parameter"></param>
        public virtual string StartPay(PayParameter parameter)
        {
            if (parameter.AuthCode.IsNullOrEmpty())
            {
                throw new Exception("条码为空");
            }
            if (parameter.TradeID.IsNullOrEmpty())
            {
                throw new Exception("交易编号为空");
            }


            try
            {
                Config config = new Config(PayFactory.GetInterfaceXmlConfig(PayInterfaceType.AlipayBarcode, parameter.TradeID));


                //创建提交的内容
                AlipayTradePayContentBuilder builder = BuildPayContent(config, parameter);
                var client = config.AppConfig.CreateAopClient();
                AlipayTradePayRequest payRequest = new AlipayTradePayRequest();
                payRequest.BizContent = builder.BuildJson();

                AlipayTradePayResponse payResponse = client.Execute(payRequest);

                PayFactory.OnLog(parameter.TradeID, payResponse.Body);

                string[] errorCodes = new string[] { "20000", "20001", "40001", "40002", "40003", "40004", "40006" };//明确一定是错误的代码

                if (errorCodes.Contains(payResponse.Code))
                {
                    PayFactory.OnPayFailed(parameter.TradeID, payResponse.SubMsg, payResponse.Body);
                }
                else if (payResponse.Code == ResultCode.SUCCESS)
                {
                    PayFactory.OnPaySuccessed(parameter.TradeID, payResponse.Body);
                }
                else
                {
                    //到这里,不能确定支付结果,循环30秒确定
                    int checkTimes = parameter.Timeout / 2;
                    Thread.Sleep(1000);
                    for (int i = 0; i < checkTimes; i++)
                    {
                        if (checkPayStateByConfig(parameter, config))
                        {
                            break;
                        }
                        if (i + 1 == checkTimes)
                        {
                            break;
                        }
                        Thread.Sleep(2000);
                    }
                }
            }
            catch (Exception ex)
            {
            }

            return(null);
        }