01.在Unity里写好调用接口(2018-05-26
0:58:50)
在unity里要做的事情有两个:
一:与服务器进行通信获取支付的参数
二:调用ios的支付接口并且监听回调通知
首先来看下网络类:
usingSystem.Net;
usingSystem.Net.Sockets;
usingSystem.Text;
usingSystem.Threading;
usingUnityEngine;
///<summary>
///用于与我们写的服务器进行交互的
///</summary>
publicclassNetMgr:MonoBehaviour
{
publicstaticNetMgrinstance;//单例
publicstringr_message;
//远程发送消息过来的端口本地端口
privateEndPointremoteEndPoint,localPoint;
//服务器端口
IPEndPointserverPoint;
//本地的UDP网络通信实例
SocketudpClient;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//接收消息的线程发送消息的线程
ThreadrecTh,sendThread;
stringstr="wantpay";
//存储调起微信支付所需的参数
string[]msg=newstring[7];
boolIsMsgHandle=true;
//获取参数
publicstringappid;
publicstringmch_id;
publicstringprepayid;
publicstringnoncestr;
publicstringtimestamp;
publicstringpackageValue;
publicstringsign;
publicstringalicanshu;
voidAwake()
{
//单例模式方便外部调用
instance=this;
}
voidStart()
{
#region网络的初始化
udpClient=new
Socket(AddressFamily.InterNetwork,SocketType.Stream,
ProtocolType.Tcp);
remoteEndPoint=new
IPEndPoint(IPAddress.Parse("193.112.30.89"),7679);
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
udpClient.Connect(remoteEndPoint);
//实例化接收网络消息的线程从服务器接收消息
recTh=newThread(Recmsg);
recTh.Start();
#endregion
}
#region接收消息
privatevoidRecmsg()
{
//存储网络消息的容器
byte[]data=newbyte[1024];
//循环接收网络发来的数据
while(true)
{
//ref表示可以对后面的变量remoteEndPoint进行修改
保留实际的数据,length是返回数据的长度
intlength=udpClient.ReceiveFrom(data,ref
remoteEndPoint);
//将byte字节数组(网络传输数据)转化为字符串
stringmessage=
Encoding.UTF8.GetString(data,0,length);
//如果转化后的字符串不等于空
if(message!="")
{
//在输出数据的时候,需要将remoteEndPoint类型
转化为IPEndPoint类型,然后再获取它里面的ip,端口属性.
Debug.Log("从ip:"+(remoteEndPointas
IPEndPoint).Address.ToString()+":"+
(remoteEndPointasIPEndPoint).Port
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
+";收到了数据:"+message+"\n"
);
//通过逗号的形式进行拼接
if(str=="钻石*")
{
alicanshu=message;
}else
{
//切割网络数据转换后的字符串得到调起支
付所需参数
msg=message.Split(',');
appid=msg[0];
mch_id=msg[1];
prepayid=msg[2];
noncestr=msg[3];
timestamp=msg[4];
packageValue=msg[5];
sign=msg[6];
Debug.Log("已获取支付所需参数!");
}
IsMsgHandle=false;//等待处理消息=false
表示有消息未处理在Update里检测到它是false的时候就调用支付
接口
message="";//清空本次从网络获取的数据转化
的字符串等待下条数据
}
}
}
#endregion
#region发送消息
///<summary>
///发送消息告诉服务器要进行充值了
///</summary>
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
publicvoidSendToServer(stringstr)
{
this.str=str;
//启动发送网络数据的线程SendMsg
sendThread=newThread(SendMsg);
sendThread.Start();
}
//发送消息告诉服务器我要进行支付了str是跟服务器的同事制
定的支付协议
voidSendMsg()
{
byte[]data=Encoding.UTF8.GetBytes(str);//封装
发送数据转化为byte[]字节数组
udpClient.SendTo(data,remoteEndPoint);//发送到服
务器
Debug.Log("向服务器请求微信支付参数");
sendThread.Abort();//中止线程
}
#endregion
privatevoidUpdate()
{
//如果有消息要进行处理就调用SDMManager的
SendWechatPay让安卓层调起微信支付
if(IsMsgHandle==false)
{
if(str=="钻石*")
{
Debug.Log("收到网络消息,解析完毕,现在调用阿
里支付接口");
this.GetComponent<SDKManager>
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143