NLDClient-yudde/ProjectNLD/Assets/Code/Scripts/Gameplay/IAP/WXPayHandle.cs

291 lines
9.4 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using NLDPB;
using System;
using PhxhSDK;
using Gameplay;
using System.Text;
using UnityEngine;
using Gameplay.Net;
using Newtonsoft.Json;
using UnityEngine.Networking;
using Cysharp.Threading.Tasks;
using System.Collections.Generic;
using System.Text.RegularExpressions;
public class WXPayHandle : SingletonMono<WXPayHandle>
{
private static WXPayHandle _instance;
private void Awake()
{
if (_instance == null)
{
_instance = this;
InitWxPay();
DontDestroyOnLoad(gameObject);
}
else
{
Destroy(gameObject);
}
}
void OnApplicationPause(bool pauseStatus)
{
if (starPay && !isCallBack && !pauseStatus)
{
DebugUtil.Log("用户直接回到应用");
starPay = false;
WaitingForServer.Instance.EventDone(WaitingForServer.EventName.Pay);
}
}
private const string PayPost = "orders/wechat";
[Serializable]
private class PayRequestData
{
public string items;
public int actor_id;
public PayRequestData(string items, int actorID)
{
this.items = items;
actor_id = actorID;
}
}
[Serializable]
private class Items
{
public string product_id;
public int count;
}
// 请求结果
private class WebRequestResult
{
public int code;
public string message;
public WxData data;
}
private class WxData
{
public string noncestr;
public string package;
public string partnerid;
public string prepayid;
public string sign;
public string timestamp;
}
/// <summary>
/// 是否有回调结果
/// </summary>
private bool isCallBack;
/// <summary>
/// 开始支付
/// </summary>
private bool starPay;
/// <summary>
/// 开始支付
/// </summary>
public void BuyGoods(string currencyID, int count)
{
WaitingForServer.Instance.EventWaiting(WaitingForServer.EventName.Pay, false);
starPay = true;
WxPayRequest(currencyID, count);
}
/// <summary>
/// 请求服务器
/// </summary>
private async void WxPayRequest(string currencyID, int count)
{
var actorID = (int)Actor.Instance.Base.GetProp(ActorProp.ActorId);
var payUrl = AppConfig.Instance.LoginURL + PayPost;
DebugUtil.Log("发送拉起微信支付请求地址: " + payUrl);
var itemsList = new List<Items> { new() { product_id = currencyID, count = count } };
var itemJsonData = JsonConvert.SerializeObject(itemsList);
DebugUtil.Log("items.jsonData:{0}", itemJsonData);
PayRequestData sendData = new PayRequestData(itemJsonData, actorID);
var headData = PostHeader.PostHeaderInfo(new Dictionary<string, string>
{
{ "items", sendData.items },
{ "actor_id", sendData.actor_id.ToString() },
{ "timestamp", DateTimeOffset.UtcNow.ToUnixTimeSeconds().ToString() }
});
var jsonData = JsonUtility.ToJson(sendData);
DebugUtil.Log("WebRequestData.jsonData:{0}", jsonData);
var bytes = Encoding.UTF8.GetBytes(jsonData);
var www = new UnityWebRequest(payUrl, UnityWebRequest.kHttpVerbPOST)
{
uploadHandler = new UploadHandlerRaw(bytes),
downloadHandler = new DownloadHandlerBuffer(),
};
www.SetRequestHeader("Content-Type", "application/json;charset=utf-8"); //为了保证客户端发送的json格式在后端能解析
www.SetRequestHeader("signature", headData["signature"]);
www.SetRequestHeader("timestamp", headData["timestamp"]);
www.SetRequestHeader("accessKey", headData["accessKey"]);
try
{
await www.SendWebRequest();
if (www.result != UnityWebRequest.Result.Success)
{
CommonUtils.ShowMessageTips("支付失败,请重试");
DebugUtil.LogError(www.downloadHandler.text);
}
else
{
DebugUtil.Log("http消息请求成功\n返回内容" + www.downloadHandler.text);
WebRequestResult result = JsonConvert.DeserializeObject<WebRequestResult>(www.downloadHandler.text);
if (result.code == 0)
{
BuyGoods(result.data);
DebugUtil.Log("拉起微信支付SDK成功");
}
else
{
DebugUtil.LogError("拉起微信支付SDK失败");
UITipsManager.ShowTips("支付失败,请重试");
WaitingForServer.Instance.EventDone(WaitingForServer.EventName.Pay);
}
}
}
catch (UnityWebRequestException e)
{
DebugUtil.LogError(e);
var pattern = @"\{.*\}";
var match = Regex.Match(e.Message, pattern);
if (match.Success)
{
var json = match.Value;
WebRequestResult res = JsonConvert.DeserializeObject<WebRequestResult>(json);
DebugUtil.LogError("请求失败, 服务器有错误响应: " + res.message);
UITipsManager.ShowTips("无法购买");
}
else
{
UITipsManager.ShowTips("无法购买");
DebugUtil.LogError("请求失败!");
}
WaitingForServer.Instance.EventDone(WaitingForServer.EventName.Pay);
}
}
#region 与微信通信
private const string AppID = "wxa286fb2f1bcb664c"; // AppID
private const string PayMethodName = "WxPayByApp"; // 调起微信支付的方法
private const string InitMethodName = "WechatInit"; // 调起微信初始化方法
private const string WxAndroidClassName = "com.phxh.official.nld.wx.MainActivity";
private AndroidJavaObject utils;
/// <summary>
/// 初始化WXPay
/// </summary>
private void InitWxPay()
{
try
{
DebugUtil.Log("开始初始化微信支付");
using AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
var currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
utils = new AndroidJavaObject(WxAndroidClassName);
utils.Call(InitMethodName, currentActivity);
}
catch (Exception e)
{
DebugUtil.Log("初始化微信支付异常:{0}", e);
}
}
public bool CheckWxInit()
{
try
{
if (utils == null)
return false;
var result = utils.Call<bool>("IsWechatInstalled");
return result;
}
catch (Exception e)
{
DebugUtil.LogError("WxPayHandle.CheckWxInit Error, e:{0} ", e);
return false;
}
}
/// <summary>
/// 支付回调
/// </summary>
public void WxPayCallback(string str)
{
// 返回结果 0 成功
// -1 错误 可能的原因签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、其他异常原因等
// -2 用户取消
try
{
starPay = false;
isCallBack = true;
DebugUtil.Log("微信支付回调, 结果码:{0}", str);
if (int.TryParse(str, out var code))
{
switch (code)
{
case -2:
UITipsManager.ShowTips("取消支付");
break;
case -1:
UITipsManager.ShowTips("支付失败,请重试");
break;
}
}
UIManager.Instance.CloseWindow(UINameConst.UI_Pay);
WaitingForServer.Instance.EventDone(WaitingForServer.EventName.Pay);
}
catch (Exception e)
{
DebugUtil.LogError("WXPayHandle.WxPayCallback error:{0}", e);
WaitingForServer.Instance.EventDone(WaitingForServer.EventName.Pay);
}
}
private void BuyGoods(WxData wxData)
{
if (wxData == null)
{
DebugUtil.LogError("请求支付数据为空");
return;
}
isCallBack = false;
// PayMethodName // 支付方法
// req.appId = APP_ID; // 应用ID
// req.partnerId = MCH_ID; // 商户号
// req.prepayId = prepayid; // 预支付交易会话ID
// req.packageValue = packageValue; // 包名
// req.nonceStr = noncaestr; // 随机字符串
// req.timeStamp = timestamp; // 时间戳
// req.sign = sign; // 签名
// WXPayEntryActivity.GameObjectName = callBackObjectName; // 支付回调组件
// WXPayEntryActivity.CallBackFuncName = CallBackFuncName; // 支付回调方法
DebugUtil.Log("开始调起微信支付");
utils.Call(PayMethodName, AppID, wxData.partnerid, wxData.prepayid, wxData.package, wxData.noncestr,
wxData.timestamp, wxData.sign, "WXPayHandle",
"WxPayCallback");
}
#endregion
}