更新记录
1.1.1(2021-08-03)
1.更新新版sdk 2.更新文档
平台兼容性
Android | Android CPU类型 | iOS |
---|---|---|
适用版本区间:9.0 - 11.0 | armeabi-v7a:未测试,arm64-v8a:未测试,x86:未测试 | 适用版本区间:9 - 14 |
原生插件通用使用流程:
- 购买插件,选择该插件绑定的项目。
- 在HBuilderX里找到项目,在manifest的app原生插件配置中勾选模块,如需要填写参数则参考插件作者的文档添加。
- 根据插件作者的提供的文档开发代码,在代码中引用插件,调用插件功能。
- 打包自定义基座,选择插件,得到自定义基座,然后运行时选择自定义基座,进行log输出测试。
- 开发完毕后正式云打包
付费原生插件目前不支持离线打包。
Android 离线打包原生插件另见文档 https://nativesupport.dcloud.net.cn/NativePlugin/offline_package/android
iOS 离线打包原生插件另见文档 https://nativesupport.dcloud.net.cn/NativePlugin/offline_package/ios
注意事项:使用HBuilderX2.7.14以下版本,如果同一插件且同一appid下购买并绑定了多个包名,提交云打包界面提示包名绑定不一致时,需要在HBuilderX项目中manifest.json->“App原生插件配置”->”云端插件“列表中删除该插件重新选择
以下插件都要配合服务端配合使用; 一般流程基本都是这个套路 1.app 向服务端申请一个请求参数 2 app 根据这个参数调起第三方APP 3app向服务端查询结果,并且更新数据库;
一.银联支付
var btModule = uni.requireNativePlugin("ybt-BTModule");
const installed = btModule.checkWalletInstalled() //检查是否安装
//sdk 会自动处理,是否安装云闪付,跳转情况;
unionPay(order).then(res => { //代码演示仅供参考,从服务端发起支付,并且返回tn号 参考银联文档(https://open.unionpay.com/tjweb/acproduct/APIList?apiservId=568&acpAPIId=740&bussType=1)
//后端代码demo地址 (https://open.unionpay.com/tjweb/acproduct/list?apiSvcId=449&index=5)
btModule.unionPay({
mode: "00", // 00 生成环境 ,01测试环境 , app 只能生成环境
scheme: "****", //ios才生效的scheme码 ,必须和后端的return:url 一致,否则iOS不能跳回
tn: res.data.tn //服务器返回的tn号
}, (obj) => {
// 查询订单 //这里统一查询订单情况,自己实现
if (obj.code == 'success') {
// 查询订单
//resolve("支付成功")
} else {
reject(obj.message); //取消支付 支付失败等等
}
})
})
二.支付宝 身份认证
此SDK 还支持 支持支付宝 人脸认证SDK 集成,不依赖支付宝的安装
① SDK 集成方案
var bizCode = btModule.bizCode(); //获取bizCode 决定是否拉起支付宝客户端,这里可以手动指定
aliPayCertification({ //后端代码实现,仅供参考,参考官方文档 (https://opendocs.alipay.com/open/20181012100420932508/00ze52)
bizCode:bizCode,
returnUrl:"*******" //例:schema://abc (app 的 schema码)
}).then(res => {
res.bizCode = bizCode
me.certifyId = res.certifyId;
btModule.aliPayCertification({
url:res.url, //后台返回的url地址
certifyId:res.certifyId //后台返回的certifyId,
biz:bizCode
},(obj)=>{
})
})
② H5简易方案
简单,容易,但是必须依赖支付宝客户端,完美注意者选择第一种更佳,可以手动强制跳转内置页面,不跳转
const url = "://platformapi/startapp?appId=20000067&url=" + encodeURIComponent(res.url) //这里的URL 就是后端生成的URL
plus.runtime.openURL("alipays" + url) //这里注意区分 ios 是alipays, android 是alipay
-------------------------------返回结果-----------------------------
分两种情况如果
第一种:支付宝客户端回来;第二张:如果未安装客户端,可以设置自定义参数更新;
onShow() {
var me = this;
setTimeout(()=>{
var args = plus.runtime.arguments;
if (args == '******') { //上面传的returnurl
//去后端查询人脸识别认证结果,通过certifyId
}
},50)
};
----------springboot服务端代码,简单demo,仅供参考,请结合实际业务--------------- 例:银联如果获取银联的tn号,必须参考实际文档 @PostMapping(value = "/order.do") public AjaxResult order(@RequestBody PaymentParam order){
//组织请求报文
net.sf.json.JSONObject json = new net.sf.json.JSONObject();
json.put("mid", unionPayBean.getMid());
json.put("tid", unionPayBean.getTid());
json.put("msgType", unionPayBean.getMsgType_order());
json.put("msgSrc", unionPayBean.getMsgSrc());
json.put("instMid", unionPayBean.getInstMid());
Snowflake snowflake =IdUtil.createSnowflake(1,1);
long id = snowflake.nextId();
String orderId = msgSrcId+order.getOrderInfo().getOutTradeNo().substring(3)+String.valueOf(id);
json.put("merOrderId", orderId.substring(0,32));
json.put("totalAmount", order.getOrderInfo().getTotalFee());
json.put("tradeType", "APP");
//是否要在商户系统下单,看商户需求 createBill()
json.put("requestTimestamp", DateFormatUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss"));
json.put("signType", "SHA256");
Map<String, String> paramsMap = Util.jsonToMap(json);
paramsMap.put("sign", Util.makeSign(unionPayBean.getMd5Key(), paramsMap));
String strReqJsonStr = JSON.toJSONString(paramsMap);
JSONObject resultMap = new JSONObject();
try {
String content = HttpRequest.post(unionPayBean.getUrl())
.body(strReqJsonStr)
.execute().body();
//转换成json对象
com.alibaba.fastjson.JSONObject respJson = JSON.parseObject(content);
String resultCode = respJson.getString("errCode");
if("SUCCESS".equals(resultCode)){
return AjaxResult.success(respJson.get("appPayRequest")); //tn号返回给客户端即可
}
} catch (Exception e) {
e.printStackTrace();
return AjaxResult.error(e.toString());
}
return AjaxResult.error("支付失败");
}
------------------------------------分割线----------------------------------
例:java 获取实名认证的certifyId,必须参考实际文档,仅供参考,请结合实际业务 public AjaxResult alipayCertification(@RequestParam String bizCode,@RequestParam String returnUrl) { try { RealNameAuth realNameAuth = iRealNameAuthService.selectRealNameAuthByRiderId(riderId); if(realNameAuth==null){ throw new BaseException("请先补充身份信息"); } JSONObject jsonObject = new JSONObject(); JSONObject jsonObjectPerson = new JSONObject(); jsonObjectPerson.put("identity_type","CERT_INFO"); jsonObjectPerson.put("cert_name",realNameAuth.getRealName()); jsonObjectPerson.put("cert_no",realNameAuth.getIdCardno()); jsonObjectPerson.put("phone_no",realNameAuth.getPhonenumber()); jsonObjectPerson.put("cert_type","IDENTITY_CARD"); jsonObject.put("outer_order_no", IdUtil.objectId()); jsonObject.put("biz_code",bizCode); jsonObject.put("identity_param",jsonObjectPerson); JSONObject urlObject = new JSONObject(); urlObject.put("return_url", returnUrl); jsonObject.put("merchant_config",urlObject);
String str = jsonObject.toJSONString();
AlipayUserCertifyOpenInitializeRequest request = new AlipayUserCertifyOpenInitializeRequest();
request.setBizContent(str);
AlipayClient client = AliPayApiConfigKit.getAliPayApiConfig().getAliPayClient();
AlipayUserCertifyOpenInitializeResponse response= client.certificateExecute(request);
AlipayUserCertifyOpenCertifyRequest request1 = new AlipayUserCertifyOpenCertifyRequest();
JSONObject bizContentObj = new JSONObject ();
bizContentObj.put ("certify_id" , response.getCertifyId() );
request1.setBizContent(bizContentObj.toString ());
AlipayUserCertifyOpenCertifyResponse response1 = client.pageExecute(request1,"GET");
if(response.isSuccess()){
JSONObject resObject = new JSONObject();
resObject.put("certifyId",response.getCertifyId()); //certifyId返回给客户端,再去调起支付宝客户端
resObject.put("url",response1.getBody());
return AjaxResult.success(resObject);
} else {
throw new AlipayApiException("参数错误");
}
} catch (AlipayApiException e) {
return AjaxResult.error(e.getMessage());
}
}
注意事项: 1.manifest.json 配置一下 schemes,和后端的return_url 保持一致