App支付Android集成流程:(打开cocos creator打包后的android studio 工程)
1:导入开发资源
将alipaySdk-xxxxxxxx.jar包放入商户应用工程的libs目录下,如下图。
2:将此jar包导入到依赖jar包中去:右键jar包选择 Add as Library
3:下载官方demo,将demo中的有用方法集成到自己游戏当中去:以下为有用方法集合:
将上面画红线的类的包名改成:org.cocos2dx.javascript导入完成
4:将这些属性放到AppActivity当中去:
扫描二维码关注公众号,回复:
3593022 查看本文章
/* * * 支付宝业务数据开始 * * */ /** 支付宝支付业务:入参app_id */ public static final String APPID = "你的沙箱appid"; /** 支付宝账户登录授权业务:入参pid值 */ public static final String PID = "合作伙伴id"; /** 支付宝账户登录授权业务:入参target_id值 */ public static final String TARGET_ID = ""; //支付结果 public static String alipayResult = null; /** 商户私钥,pkcs8格式 */ /** 如下私钥,RSA2_PRIVATE 或者 RSA_PRIVATE 只需要填入一个 */ /** 如果商户两个都设置了,优先使用 RSA2_PRIVATE */ /** RSA2_PRIVATE 可以保证商户交易在更加安全的环境下进行,建议使用 RSA2_PRIVATE */ /** 获取 RSA2_PRIVATE,建议使用支付宝提供的公私钥生成工具生成, */ /** 工具地址:https://doc.open.alipay.com/docs/doc.htm?treeId=291&articleId=106097&docType=1 */ public static final String RSA2_PRIVATE = "你的私钥必须填写"; public static final String RSA_PRIVATE = ""; private static final int SDK_PAY_FLAG = 1; private static final int SDK_AUTH_FLAG = 2; /* * * 支付宝业务数据声明结束 * * */注意上面的
RSA2_PRIVATE 和 app_id需要根据自己的沙箱填写
5:加入支付宝处理方法:用于向支付宝服务器提交数据及返回给我们支付信息,注意这里支付信息的获取就是在这里获取的。
@SuppressLint("HandlerLeak") public static Handler mHandler = new Handler() { @SuppressWarnings("unused") public void handleMessage(Message msg) { System.out.println("msg is " + msg); switch (msg.what) { case SDK_PAY_FLAG: { @SuppressWarnings("unchecked") PayResult payResult = new PayResult((Map<String, String>) msg.obj); System.out.println("------------->>>>>>payResult is " + payResult.getResult()); alipayResult = payResult.getResult().toString(); isPay = true; System.out.println("alipayResult is " + alipayResult.toString()); /** 对于支付结果,请商户依赖服务端的异步通知结果。同步通知结果,仅作为支付结束的通知。 */ String resultInfo = payResult.getResult();// 同步返回需要验证的信息 String resultStatus = payResult.getResultStatus(); // 判断resultStatus 为9000则代表支付成功 if (TextUtils.equals(resultStatus, "9000")) { // 该笔订单是否真实支付成功,需要依赖服务端的异步通知。 Toast.makeText(AppActivity.app, "支付成功", Toast.LENGTH_SHORT).show(); } else { // 该笔订单真实的支付结果,需要依赖服务端的异步通知。 Toast.makeText(AppActivity.app, "支付失败", Toast.LENGTH_SHORT).show(); } break; } case SDK_AUTH_FLAG: { @SuppressWarnings("unchecked") AuthResult authResult = new AuthResult((Map<String, String>) msg.obj, true); //打印支付信息 // System.out.println("authResult is " + authResult); // //将result返回回去 // alipayResult = authResult; // alipayResult = authResult; String resultStatus = authResult.getResultStatus(); // 判断resultStatus 为“9000”且result_code // 为“200”则代表授权成功,具体状态码代表含义可参考授权接口文档 if (TextUtils.equals(resultStatus, "9000") && TextUtils.equals(authResult.getResultCode(), "200")) { // 获取alipay_open_id,调支付时作为参数extern_token 的value // 传入,则支付账户为该授权账户 Toast.makeText(AppActivity.app, "授权成功\n" + String.format("authCode:%s", authResult.getAuthCode()), Toast.LENGTH_SHORT) .show(); } else { // 其他状态值则为授权失败 Toast.makeText(AppActivity.app, "授权失败" + String.format("authCode:%s", authResult.getAuthCode()), Toast.LENGTH_SHORT).show(); } break; } default: break; } }; };
这里的alipayResult = payResult.getResult().toString();这个alipayResult就是服务端需要的数据,需要将这些数据给商户服务器的数据
6:接下来看看我们的主角方法:payV2()方法,这里的payV2方法是从官方demo中copy进来的照抄就完事了:
/** * final String orderMessage * * */ public static String payV2(final String orderMessage) { System.out.println("orderMessage is " + orderMessage); if (TextUtils.isEmpty(APPID) || (TextUtils.isEmpty(RSA2_PRIVATE) && TextUtils.isEmpty(RSA_PRIVATE))) { new AlertDialog.Builder(app).setTitle("警告").setMessage("需要配置APPID | RSA_PRIVATE") .setPositiveButton("确定", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialoginterface, int i) { // } }).show(); return ""; } /** * 这里只是为了方便直接向商户展示支付宝的整个支付流程;所以Demo中加签过程直接放在客户端完成; * 真实App里,privateKey等数据严禁放在客户端,加签过程务必要放在服务端完成; * 防止商户私密数据泄露,造成不必要的资金损失,及面临各种安全风险; * * orderInfo的获取必须来自服务端; */ // // boolean rsa2 = (RSA2_PRIVATE.length() > 0); // Map<String, String> params = org.cocos2dx.javascript.util.OrderInfoUtil2_0.buildOrderParamMap(APPID, rsa2); // String orderParam = OrderInfoUtil2_0.buildOrderParam(params); // // String privateKey = rsa2 ? RSA2_PRIVATE : RSA_PRIVATE; // String sign = OrderInfoUtil2_0.getSign(params, privateKey, rsa2); // final String orderInfo = orderParam + "&" + sign; Runnable payRunnable = new Runnable() { @Override public void run() { PayTask alipay = new PayTask(app); Map<String, String> result = alipay.payV2(orderMessage, true); Log.i("msp", result.toString()); Message msg = new Message(); msg.what = SDK_PAY_FLAG; msg.obj = result; mHandler.sendMessage(msg); } }; Thread payThread = new Thread(payRunnable); payThread.start(); System.out.println("alipayResult is " + alipayResult); if(alipayResult != null){ //返回支付结果信息 return alipayResult.toString(); }else{ //返回空字符串 return ""; } }
这个方法也正是js调用java方法的主要方法,就是它调起支付宝进行支付的,通过返回alipayResult将服务器和我们联系在一起。
7:声明两个静态方法,看看是否支付成功:
//判断是否支付成功 public static boolean isPaySuccess(){ System.out.println("isPay is " + isPay); return isPay; } //支付成功之后调用该方法获得支付信息 public static String getPayResult(){ System.out.println("in getPayResult alipayResult is " + alipayResult); return alipayResult; }
注意这些方法里面的变量我们定义成了静态的变量便于js和java之间方便传递数据
8:进入cocos 项目:查看关于支付宝支付的接口定义:
//支付宝支付接口
alipayEvent
:
function(){
var
self =
this;
console.
log(
"-------------------");
var
url =
Host.
host +
"orderByAlipay";
var
xhr =
new
XMLHttpRequest();
xhr.
onreadystatechange =
function(){
if (
xhr.
readyState ==
4 && (
xhr.
status >=
200 &&
xhr.
status <
400)){
console.
log(
"<<<<<<<<<<<<<<<<<<<<<<<<<<<<<");
var
response =
xhr.
responseText;
var
jsonResponse =
JSON.
parse(
response);
console.
log(
"response is " +
jsonResponse);
if(
response !=
null){
if(
cc.
sys.
os ===
cc.
sys.
OS_ANDROID){
//如果响应部位空的话
console.
log(
"response is " +
jsonResponse.
str);
var
payResult =
jsb.
reflection.
callStaticMethod(
"org/cocos2dx/javascript/AppActivity",
"payV2",
"(Ljava/lang/String;)Ljava/lang/String;",
jsonResponse.
str);
console.
log(
"payResult is " +
payResult);
//当返回的支付结果不是空字符串的时候
if(
payResult ===
""){
//每0.5秒请求一次
self.
schedule(
function(){
var
isPay =
jsb.
reflection.
callStaticMethod(
"org/cocos2dx/javascript/AppActivity",
"isPaySuccess",
"()Z");
if(
isPay){
console.
log(
"is pay is " +
isPay);
//如果支付状态为true的话获得支付信息
payResult =
jsb.
reflection.
callStaticMethod(
"org/cocos2dx/javascript/AppActivity",
"getPayResult",
"()Ljava/lang/String;");
console.
log(
"payResult is " +
payResult);
//取消所有的计时器
self.
unscheduleAllCallbacks();
//打印payResult
console.
log(
"---------->>>>>>>>>>>>>>>payResult is " +
payResult);
//将支付宝返回的数据传给服务器
self.
payResultFun(
payResult);
}
},
0.5);
}
else{
//如果刚开始请求的时候是成功的话将支付信息返回给服务器端
self.
payResultFun(
payResult);
}
}
else{
console.
log(
"该平台暂时不支持支付功能");
}
}
}
}
xhr.
open(
"POST",
url);
xhr.
send();
},
//向服务器发送支付结果
payResultFun
:
function(
payResult){
console.
log(
"<<<<<<<<<<<<<<<<<<<<< payResult is " +
payResult);
console.
log(
"type of payResult is " +
typeof(
payResult));
var
self =
this;
var
url =
Host.
host +
"verify";
//短连接请求
this.
createShortConnection(
url,
payResult);
},
//创建一个短连接
createShortConnection
:
function(
url,
data){
//创建一个XMLHttpRequest对象
var
xhr =
new
XMLHttpRequest();
//监听短连接状态
xhr.
onreadystatechange =
function(){
if(
xhr.
readyState ===
4 && (
xhr.
status >=
200 &&
xhr.
status <
400)){
var
response =
xhr.
responseText;
console.
log(
"response is " +
response);
}
}
xhr.
open(
"POST",
url);
//发送数据
xhr.
send(
data);
},