示例#1
0
        /// <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);
        }
示例#2
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);
            }
        }