cocos creator集成支付宝支付功能--安卓篇

App支付Android集成流程:(打开cocos creator打包后的android studio 工程)

1:导入开发资源

将alipaySdk-xxxxxxxx.jar包放入商户应用工程的libs目录下,如下图。

1.png

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);
},
至此支付宝支付完成。

猜你喜欢

转载自blog.csdn.net/lck8989/article/details/80324391
今日推荐