//请求购买商品 如果要微信支付就会返回 如果只是需要钻石就会直接购买
        public static async Task <WeChatOrderInfo> RequestTopUp(this TopUpComponent topUpComponent, long userId, long commodityId, IResponse iResponse)
        {
            Commodity commodity = ShoppingCommodityComponent.Ins.GetCommdity(commodityId);

            if (commodity.MonetaryType == GoodsId.CNY)
            {
                WeChatOrderInfo weChatOrderInfo = WeChatPayComponent.Ins.WeChatPlaceOrder(commodity.Price);
                TopUpRecord     topUpRecord     = TopUpRecordFactory.Create(weChatOrderInfo.outTradeNo, userId, commodity);
                await Game.Scene.GetComponent <DBProxyComponent>().Save(topUpRecord);//存储充值记录

                return(weChatOrderInfo);
            }
            else if (commodity.MonetaryType == GoodsId.Jewel)
            {
                User user = await UserHelp.QueryUserInfo(userId);

                if (user.Jewel >= commodity.Price)
                {
                    await user.GoodsChange(GoodsId.Jewel, commodity.Price * -1, GoodsChangeType.ShopPurchase);       //减少钻石

                    await user.GoodsChange(commodity.CommodityType, commodity.Amount, GoodsChangeType.ShopPurchase); //增加商品数量
                }
                else
                {
                    iResponse.Message = "钻石不足";
                }
            }
            return(null);
        }
        //完成支付
        public static async void FinishPay(this TopUpComponent topUpComponent, string outTradeNo, bool isRepairOrder = false)
        {
            DBProxyComponent   dbProxyComponent = Game.Scene.GetComponent <DBProxyComponent>();
            List <TopUpRecord> topUpRecords     = await dbProxyComponent.Query <TopUpRecord>(topUpRecord => topUpRecord.OrderId.Equals(outTradeNo));

            if (topUpRecords.Count <= 0)
            {
                Log.Error("没有充值记录 订单id:" + outTradeNo);
            }
            else
            {
                TopUpRecord topUpRecord = topUpRecords[0];
                if (topUpRecord.TopUpState == TopUpStateType.NoPay)
                {
                    await UserHelp.GoodsChange(topUpRecord.TopUpUserId, topUpRecord.GoodsId, topUpRecord.GoodsAmount, GoodsChangeType.ShopPurchase);

                    topUpRecord.TopUpState = TopUpStateType.AlreadyPay;
                    if (isRepairOrder)
                    {
                        topUpRecord.TopUpState = TopUpStateType.RepairOrder;
                    }
                    await dbProxyComponent.Save(topUpRecord);
                }
                else
                {
                    Log.Error("订单id:" + outTradeNo + "订单已经完成 重复收到完成消息");
                }
            }
        }
Example #3
0
        //-----------------------微信下单代码----------------------
        //微信统一下单
        public static WeChatOrderInfo WeChatPlaceOrder(float money)
        {
            WXPrePost post = new WXPrePost();

            post.appid            = Pay_App_Id;
            post.mch_id           = PartnerId;
            post.nonce_str        = genNonceStr(32);             //随机字符串  **1 不超过32位
            post.body             = "商品购买";                      //商品标题
            post.detail           = "用于购买商品";                    //详细信息
            post.out_trade_no     = TopUpComponent.GetTradeNo(); //商户订单号 **2
            post.total_fee        = (int)(money * 100);          //单位是分
            post.spbill_create_ip = "127.0.0.1";                 //ip地址  **3

            post.notify_url = GetOuterPostAddress();             //这里是后台接受支付结果通知的url地址
            post.trade_type = "APP";
            post.sign       = genPackageSign(post);              //签名

            Dictionary <string, string> firstSignParams = getFirstSignParams(post);
            string xmlParams = toXml(firstSignParams);

            string callStr = HttpPost.Post(PlaceOrderUrl, xmlParams);

            // Console.WriteLine("收到下单回调:");
            // Console.WriteLine(callStr);
            XElement xe       = XElement.Parse(callStr);
            string   prepayId = xe.Element("prepay_id").Value;
            string   nonceStr = xe.Element("nonce_str").Value;

            // Console.WriteLine("prepay_id:"+ prepayId);
            // Console.WriteLine("nonce_str:" + nonceStr);
            return(WeChatOrderInfoFactory.Creator(prepayId, nonceStr, post.out_trade_no));
        }
 //补单 就是完成支付
 public static void RepairOrder(this TopUpComponent topUpComponent, string outTradeNo, IResponse iResponse)
 {
     if (WeChatPayComponent.Ins.WeChatQueryOrder(outTradeNo))
     {
         topUpComponent.FinishPay(outTradeNo, true);
     }
     else
     {
         iResponse.Message = "未支付,无法补单";
     }
 }