第一次写Hbuilder的三方插件

第一次写Hbuilder的三方插件

  团队用Hbuilder写了一个App,Hbuilder的开发效率很好,性能比一般的H5开发框架效率要好很多,而且开发相对比较自由。但是三方插件缺非常的少,除了官方提供的几个插件,其他人开发的插件不能相互的在平台上共享,也不能把自己的功能做成插件分享,这点做的很不好,而且文档不是太理想,缺乏很好的demo,官方的demo。而恰好我们的项目需要一个连连支付的功能,连连支付提供的sdk需要集合成三方控件才能被H5调用,踩过无数坑以后,终于摸索出来了,现在把其中的要点和坑位写出来,以便大家以后可以少踩一些坑。

Android部分

下面是整个代码

public class LianlianPay extends StandardFeature{

    public void onStart(Context pContext, Bundle pSavedInstanceState, String[] pRuntimeArgs) {

        /**
         * 如果需要在应用启动时进行初始化,可以继承这个方法,并在properties.xml文件的service节点添加扩展插件的注册即可触发onStart方法
         * */
    }
    IWebview pWebview;
    String CallBackID;

    public void plusPay(IWebview pWebview, JSONArray array){
        this.pWebview = pWebview;

        CallBackID =  array.optString(0);
        try {

            String partner = array.optString(1);
            String orderNum = array.optString(2);
            String timeString = array.optString(3);
            String notifyUrl = array.optString(4);
            String userId = "NewQian100_"+ array.optString(5);
            String moneyStr = array.optString(6);
            String riskText = array.optString(7);
            String signStr = array.optString(8);
            String goodName = array.optString(9);
            String orderInfo = array.optString(10);
            String idNo = array.optString(11);
            String accName = array.optString(12);
            String bankCard = array.optString(13);

            PayOrder order = constructGesturePayOrder(partner,orderNum,timeString,goodName,orderInfo,idNo,accName,notifyUrl,userId,moneyStr,riskText,bankCard,signStr);

            MobileSecurePayer msp = new MobileSecurePayer();
            String content4Pay = BaseHelper.toJSONString(order);

            boolean bRet = msp.pay(content4Pay, mHandler,
                    Constants.RQF_PAY, pWebview.getActivity(), false);
            if(bRet){
                int i=0;
            }

        }catch (Exception ex){
            retMsg(false,-1,"参数传递有误");
        }
    }

    private Handler mHandler = new Handler(){

        @Override
        public void handleMessage(Message msg) {
            String strRet = (String) msg.obj;
            switch (msg.what) {
                case Constants.RQF_PAY: {
                    JSONObject objContent = BaseHelper.string2JSON(strRet);
                    String retCode = objContent.optString("ret_code");
                    String retMsg = objContent.optString("ret_msg");

                    if (Constants.RET_CODE_SUCCESS.equals(retCode)) {
                        //成功入金
                        retMsg(false,0,"充值成功");
                    }else if (Constants.RET_CODE_PROCESS.equals(retCode)) {
                        //正在处理中
                        retMsg(false,1,"正在处理中");
                    }else {
                        //失败
                        retMsg(false,-1,retMsg);
                    }

                    break;
                }
            }
            super.handleMessage(msg);
        }
    };

    private PayOrder constructGesturePayOrder(String partner, String orderNum, String timeString,String googdName,String orderInfo,String Idno,String accName,
                                              String notifyUrl,String userId,String money,String riskText,String bankCard, String signStr) {


        PayOrder order = new PayOrder();

        order.setBusi_partner("101001");
        order.setNo_order(orderNum);
        order.setDt_order(timeString);
        order.setName_goods(googdName);
        order.setNotify_url(notifyUrl);

        // TODO MD5 签名方式
        order.setSign_type(PayOrder.SIGN_TYPE_RSA);
        // TODO RSA 签名方式
        // order.setSign_type(PayOrder.SIGN_TYPE_RSA);
        order.setValid_order("10080");
        order.setInfo_order(orderInfo);

        order.setUser_id(userId);
        order.setId_no(Idno);
        order.setAcct_name(accName);
        order.setMoney_order(money);
        order.setFlag_modify("1");

        // 风险控制参数
        order.setRisk_item(riskText);
        order.setOid_partner(partner);

        order.setCard_no(bankCard);

        order.setSign(signStr);
        return order;
    }

    private void retMsg(boolean isSucc, int code, String msg){
        try{
            JSONObject retJson = new JSONObject();

            retJson.putOpt("IsSucc", isSucc);
            retJson.putOpt("Code",code);
            retJson.putOpt("Msg",msg);
            JSUtil.execCallback(pWebview, CallBackID, retJson, JSUtil.OK, false);
        }catch (Exception ex){

        }
    }
}

要点有那么几个

//继承和js通信的父类
LianlianPay extends StandardFeature
//通过传进来的数字来获得js插入的参数。第一个为返回的消息机制
CallBackID =  array.optString(0);
//要获得当前的Activity
pWebview.getActivity()

其中的js代码如下

function LianlianPay(partner,orderNum,timeString,notifyUrl,userId,money,riskText,signStr,goodName,orderInfo,idNo,accName,bankCard,successCallback, errorCallback)
{
    var _BARCODE = 'lianlianpay',
    B = window.plus.bridge;
    var success = typeof successCallback !== 'function' ? null : function(args)
    {
        successCallback(args);
    },
    fail = typeof errorCallback !== 'function' ? null : function(code)
    {
        errorCallback(code);
    };
    callbackID = B.callbackId(success, fail);
    return B.exec(_BARCODE, "plusPay", [callbackID,partner,orderNum,timeString,notifyUrl,userId,money,riskText,signStr,goodName,orderInfo,idNo,accName,bankCard,successCallback, errorCallback ]);
}

记得在main.fest中注册这个插件

"lianlianpay":{
            "description":"连连支付接口"
        }
//在data下面的properties下面注册注册的要求是name和在main.fest的名字一样,和js中的名字一样value是类名
<feature name="lianlianpay" value="com.dianshi.test.LianlianPay" />
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

aofengdaxia

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值