1. 首先去支付宝官网下载开发者文档
2. 然后按着开发者文档将支付宝的sdk导入到你的工程中,并关联到工程中,步骤入下图:
(1)将从支付宝官方网站获得的支付宝的sdk的jar包拷贝到工程中的libs目录下,如图
(2)右键工程选择Properties,弹出如下窗口,首先选择1,其次选中2,最后点击3将拷到工程中的三个支付宝的jar包一一关联到工程中
3. 最后修改工程的AndroidManifest.xml文件,添加新的权限和支付宝的Activity,代码如下:
新权限:
1
2
3
4
5
6
|
|
支付宝的Activity:
1
2
3
4
5
6
7
8
9
|
android:name=
"com.alipay.sdk.app.H5PayActivity"
android:configChanges=
"orientation|keyboardHidden|navigation"
android:exported=
"false"
android:screenOrientation=
"behind"
android:windowSoftInputMode=
"adjustResize|stateHidden"
>
|
到此为止支付宝sdk导入工程的工作算是完成了,接下来就是使用sdk完成付费了。
虽然破坏了java的封装性,但是为了方便起见我还是将支付宝的使用写到了一个java文件里了,我把使用放到了工程自带的HelloCpp.java文件中了,代码如/****************************************************************************Copyright (c) 2010-2012 cocos2d-x.orghttp://www.cocos2d-x.org
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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
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
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
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
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
|
Permission is hereby granted, free of charge, to any person obtaining a copy
of
this
software and associated documentation files (the
"Software"
), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to
do
so, subject to the following conditions:
The above copyright notice and
this
permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED
"AS IS"
, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
****************************************************************************/
package
org.cocos2dx.hellocpp2;
import
java.io.UnsupportedEncodingException;
import
java.net.URLEncoder;
import
java.text.SimpleDateFormat;
import
java.util.Date;
import
java.util.Locale;
import
java.util.Random;
import
org.cocos2dx.lib.Cocos2dxActivity;
import
android.os.Bundle;
import
android.os.Handler;
import
android.os.Message;
import
android.text.TextUtils;
import
android.util.Log;
import
android.view.View;
import
android.widget.Toast;
import
com.alipay.sdk.app.PayTask;
public
class
HelloCpp
extends
Cocos2dxActivity{
//private long exitTime = 0;
// 私有的类对象
private
static
HelloCpp hiCpp =
null
;
// 传回支付结果
public
static
native
void
payResultState(
int
payState);
// 以下参数根据自己的实际情况而定
//商户PID
public
static
final
String PARTNER =
"2088811977704990"
;
//商户收款账号
//商户私钥,pkcs8格式
public
static
final
String RSA_PRIVATE =
"MIICXQIBAAKBgQDlQ468L1A7Q+GG80/Z8f3IsSiiFIluSxfTTSuJ/XSPzvYS+bMZ"
+
"AQLMqq/nGhkp+1Q5pHF9LAQtQS3gL2pqzbKdtvZSsy/tNFFQcGCsgK2ygMl+MW/F"
+
"g/ufx7c1jy1kZAeDyl1m302dnRrtSgDalkgH7FKRcmDxbXPTnFGHbg9zMQIDAQAB"
+
"AoGAa28wGQF28H7L1Yh5V+FtkrlqGCHVkQjBfnRAPea205kheRzoD4SIwk4OJhb1"
+
"ydWLz4M+53BT+Lz9eXveu3PvCdQe9zMIVC5dKUNVYCvvcHZ+Ot8HriiuwGPb3Quu"
+
"twbnLGM5gxxPDo0yUyWrfaVn/qR35mS6TDfmgowVG8CmBpECQQDzuhodR/Jgxrtn"
+
"tka+88alyy+BfjUZqNloPuE7JfXrpOxH5lodk7Y4lTki/dlo5BrK+hrismLFr9Du"
+
"ueAJ7G9dAkEA8M8C6VnpUMAK5+rYcjKnQssDqcMfurKYEil1BD/TUdSbLI6v8p02"
+
"mv1ApuTVtQQypZJKIFfurGk0g0QlvzLZ5QJAGfY38+iHDAH/UnPbI1oKTfzPyaZs"
+
"95fB2NXh3hAUGw7NUHdcIAxs+6gBlxWdRAwQQpDTrlQ8KzyoL9XC5Ku3zQJBALO8"
+
"j5vEtFTFQl6f9zYlgJpmFTHcpg4fx0mnD+RAD2aAneHADquzlFJSvLLVEn2tyG+0"
+
"pQdHGqotTDi94L65IdECQQDb1h+5kugCu47IxsDkrLRsKVcr8dSDMORyeT1L0HWR"
+
"ctramBu+2PBz2UKC6+9dQ+ZQH4XTKpBSvkyZH4mYi1de"
;
//支付宝公钥
public
static
final
String RSA_PUBLIC =
"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCnxj/9qwVfgoUh/y2W89L6BkRAFljhNhgPdyPuBV64bfQNN1PjbCzkIM6qRdKBoLPXmKKMiFYnkd6rAoprih3/PrQEB/VsW8OoM8fxn67UDYuyBTqA23MML9q1+ilIZwBC2AQ2UBVOrFXfFl75p6/B5KsiNG9zpgmLCUYuLkxpLQIDAQAB"
;
private
static
final
int
SDK_PAY_FLAG =
1
;
private
static
final
int
SDK_CHECK_FLAG =
2
;
// 支付结果的处理(接收子线程反馈回来的消息)
private
Handler mHandler =
new
Handler() {
public
void
handleMessage(Message msg) {
switch
(msg.what) {
case
SDK_PAY_FLAG: {
PayResult payResult =
new
PayResult((String) msg.obj);
// 支付宝返回此次支付结果及加签,建议对支付宝签名信息拿签约时支付宝提供的公钥做验签
String resultInfo = payResult.getResult();
String resultStatus = payResult.getResultStatus();
// 判断resultStatus 为“9000”则代表支付成功,具体状态码代表含义可参考接口文档
if
(TextUtils.equals(resultStatus,
"9000"
)) {
//Toast.makeText(HelloCpp.this, "支付成功", Toast.LENGTH_SHORT).show();
HelloCpp.payResultState(
1
);
}
else
{
// 判断resultStatus 为非“9000”则代表可能支付失败
// “8000”代表支付结果因为支付渠道原因或者系统原因还在等待支付结果确认,最终交易是否成功以服务端异步通知为准(小概率状态)
if
(TextUtils.equals(resultStatus,
"8000"
)) {
// Toast.makeText(HelloCpp.this, "支付结果确认中", Toast.LENGTH_SHORT).show();
HelloCpp.payResultState(
3
);
}
else
{
// 其他值就可以判断为支付失败,包括用户主动取消支付,或者系统返回的错误
// Toast.makeText(HelloCpp.this, "支付失败", Toast.LENGTH_SHORT).show();
HelloCpp.payResultState(
2
);
}
}
break
;
}
case
SDK_CHECK_FLAG: {
Toast.makeText(HelloCpp.
this
,
"检查结果为:"
+ msg.obj,
Toast.LENGTH_SHORT).show();
break
;
}
default
:
break
;
}
};
};
protected
void
onCreate(Bundle savedInstanceState){
super
.onCreate(savedInstanceState);
hiCpp =
this
;
}
public
static
Object rtnActivity() {
System.out.println(
"----------rtnActivity"
);
return
hiCpp ;
}
static
{
System.loadLibrary(
"hellocpp"
);
}
/**
* call alipay sdk pay. 调用SDK支付
*
*/
public
void
pay(String title, String content,
float
f) {
String price = Float.toString( f );
// 订单
String orderInfo = getOrderInfo( title, content, price );
// 对订单做 RSA 签名
String sign = sign(orderInfo);
try
{
// 仅需对sign 做URL编码
sign = URLEncoder.encode(sign,
"UTF-8"
);
}
catch
(UnsupportedEncodingException e) {
e.printStackTrace();
}
// 完整的符合支付宝参数规范的订单信息
final
String payInfo = orderInfo +
"&sign=\""
+ sign +
"\"&"
+ getSignType();
Runnable payRunnable =
new
Runnable() {
@Override
public
void
run() {
// 构造PayTask 对象
PayTask alipay =
new
PayTask(HelloCpp.
this
);
// 调用支付接口,获取支付结果
String result = alipay.pay(payInfo);
Message msg =
new
Message();
msg.what = SDK_PAY_FLAG;
msg.obj = result;
mHandler.sendMessage(msg);
}
};
// 必须异步调用
Thread payThread =
new
Thread(payRunnable);
payThread.start();
}
/**
* check whether the device has authentication alipay account.
* 查询终端设备是否存在支付宝认证账户
*
*/
public
void
check(View v) {
Runnable checkRunnable =
new
Runnable() {
@Override
public
void
run() {
// 构造PayTask 对象
PayTask payTask =
new
PayTask(HelloCpp.
this
);
// 调用查询接口,获取查询结果
boolean
isExist = payTask.checkAccountIfExist();
Message msg =
new
Message();
msg.what = SDK_CHECK_FLAG;
msg.obj = isExist;
mHandler.sendMessage(msg);
}
};
Thread checkThread =
new
Thread(checkRunnable);
checkThread.start();
}
/**
* get the sdk version. 获取SDK版本号
*
*/
public
void
getSDKVersion() {
PayTask payTask =
new
PayTask(
this
);
String version = payTask.getVersion();
Toast.makeText(
this
, version, Toast.LENGTH_SHORT).show();
}
/**
* create the order info. 创建订单信息
*
*/
public
String getOrderInfo(String subject, String body, String price) {
// 签约合作者身份ID
String orderInfo =
"partner="
+
"\""
+ PARTNER +
"\""
;
// 签约卖家支付宝账号
orderInfo +=
"&seller_id="
+
"\""
+ SELLER +
"\""
;
// 商户网站唯一订单号
orderInfo +=
"&out_trade_no="
+
"\""
+ getOutTradeNo() +
"\""
;
// 商品名称
orderInfo +=
"&subject="
+
"\""
+ subject +
"\""
;
// 商品详情
orderInfo +=
"&body="
+
"\""
+ body +
"\""
;
// 商品金额
orderInfo +=
"&total_fee="
+
"\""
+ price +
"\""
;
// 服务器异步通知页面路径
orderInfo +=
"¬ify_url="
+
"\""
+
"http://notify.msp.hk/notify.htm"
+
"\""
;
// 服务接口名称, 固定值
orderInfo +=
"&service=\"mobile.securitypay.pay\""
;
// 支付类型, 固定值
orderInfo +=
"&payment_type=\"1\""
;
// 参数编码, 固定值
orderInfo +=
"&_input_charset=\"utf-8\""
;
// 设置未付款交易的超时时间
// 默认30分钟,一旦超时,该笔交易就会自动被关闭。
// 取值范围:1m~15d。
// m-分钟,h-小时,d-天,1c-当天(无论交易何时创建,都在0点关闭)。
// 该参数数值不接受小数点,如1.5h,可转换为90m。
orderInfo +=
"&it_b_pay=\"30m\""
;
// extern_token为经过快登授权获取到的alipay_open_id,带上此参数用户将使用授权的账户进行支付
// orderInfo += "&extern_token=" + "\"" + extern_token + "\"";
// 支付宝处理完请求后,当前页面跳转到商户指定页面的路径,可空
orderInfo +=
"&return_url=\"m.alipay.com\""
;
// 调用银行卡支付,需配置此参数,参与签名, 固定值 (需要签约《无线银行卡快捷支付》才能使用)
// orderInfo += "&paymethod=\"expressGateway\"";
return
orderInfo;
}
/**
* get the out_trade_no for an order. 生成商户订单号,该值在商户端应保持唯一(可自定义格式规范)
*
*/
public
String getOutTradeNo() {
SimpleDateFormat format =
new
SimpleDateFormat(
"MMddHHmmss"
,
Locale.getDefault());
Date date =
new
Date();
String key = format.format(date);
Random r =
new
Random();
key = key + r.nextInt();
key = key.substring(
0
,
15
);
return
key;
}
/**
* sign the order info. 对订单信息进行签名
*
* @param content
* 待签名订单信息
*/
public
String sign(String content) {
return
SignUtils.sign(content, RSA_PRIVATE);
}
/**
* get the sign type we use. 获取签名方式
*
*/
public
String getSignType() {
return
"sign_type=\"RSA\""
;
}
}
|
还有支付宝封装好的几个java文件,我把它们跟HelloCpp.java文件放到了同一个包中,它们分别是Base64.java,PayResult.java,SignUtils.java,源码如下:
(1)Base64.java文件源码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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
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
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
114
115
116
117
118
119
120
121
122
123
124
|