//请求购买商品 如果要微信支付就会返回 如果只是需要钻石就会直接购买 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 + "订单已经完成 重复收到完成消息"); } } }
//-----------------------微信下单代码---------------------- //微信统一下单 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 = "未支付,无法补单"; } }