示例#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);
        }