H5接入说明
wifi浏览器H5支付页面接入(不是钥匙浏览器忽略)
前端js调用钥匙浏览器4.0的通用js Api,并发起如下代码调起支付
wifikey.startComponent({
action: "opensdk.intent.action.SEND_PAY_REQ_H5",
className: "class_name1",
//ext: "test1",
type: 0,
startactivityforresult: false,
callback: "paycb"
});
js代码示例:WebView浏览器H5支付页面接入
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>weifengzz</title>
<script type="text/javascript">
//ext数据是发送给钱包sdk的数据,可在html5页面调用接口获得,也可以是native传递给H5页面
function callPay(var ext) {
window.payApi.pay(ext);
}
</script>
</head>
<body>
<input type="button" name="" value="支付" onclick="javascript:callPay("{"appid":"1212"...}")"/>
</body>
</html>
webview页面代码示例
public class MainActivity extends AppCompatActivity {
private WebView webView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
webView = (WebView) findViewById(R.id.wv);
setWebView();
}
private void setWebView(){
//允许JavaScript执行
webView.getSettings().setJavaScriptEnabled(true);
//向js传递对象
webView.addJavascriptInterface(new callPay(),"payApi");
//webView.loadUrl("file:///android_asset/index.html");
//访问网页
webView.loadUrl(url);
}
public final class callPay{
@JavascriptInterface
public void show(String ext) {
//唤起支付Action
Intent it = new Intent("opensdk.intent.action.SEND_PAY_REQ_H5");
//ext:订单相关数据,ext具体数据请查看参数释义
it.putString(ext);
startActivity(it);
}
}
}
参数释义
参数名 | 说明 |
---|---|
action | 用于拉起支付流程的action,直接固化为“opensdk.intent.action.SEND_PAY_REQ_H5” |
classname | 不用填; |
ext | 发起的订单详细参数,以json串格式组织,ext释义见 |
type | 固化整型0,表示激活客户端一个页面 |
startactivityforresult | 固化为布尔型false |
callback | 支付结果回传给html页面,js被native调用的方法名,约定为“paycb” |
ext字段是如下格式的json串
{
"appId":"djgeiq978y933",
"isRedpacket":"false",
"mPackage":"com.test.example",
"mchId":"93745648",
"nonceStr":"UO132102976893460480",
"prepayId":"WP0227110301132102976901849088",
"scheme":"wifi://open/payResult",
"sign":"EE9mq+n+3n+p8HvB5hV1SpUCl0GADI1jUTMfLr/rXTg/chigMU1O29yruqt966e3a4UAP02/MqZZL7WnVlJzx9vzRpz5uH/fMaiNUaxv5G9m0SdUCmAEh7I73XB04dlOX5Dx1z7jbdEaBICH5lsyLoMcSNU6jOXvEzKAKUnVYkXIAEeEd7Nw32v4lSKLLIOuZOIXDEPD1FxzSdENCVokVZW8Xe4FvrgSClSbiikuqebc1h8afURdk26AZZEklnMNMJftcM7Sbhs95EXIZKxfaKjqCl7TCxYO8EXpmr9BPhk5sD7fvYnpVLEjkp1DTF5L7JXE66PQR8vBd3izE2lsLQ==",
"signType":"RSA",
"timestamp":"1551236585",
"tradeType":"APP"
}
ext json字段说明
字段名 | 变量 | 必填 | 类型 | 示例值 | 描述 |
---|---|---|---|---|---|
appId |
appId | 是 | String | djgeiq978y933 |
应用ID |
mchId |
商户id | 是 | String | 703424 |
商户ID |
nonceStr |
随机字符串 | 是 | String | pWUVWVYWNQhnTXpQzhIzMGCwqBkZclzg |
随机生成的字符 |
prepayId |
预收单id | 是 | String | 预收单ID | |
sign |
验签 | 是 | String | private String getSign(CashierRequest request) { StringBuilder sb = new StringBuilder(); silverReq = new SilverReq(); sb.append("appId=").append(request.getAppId()) .append("&mchId=").append(request.getMchId()) .append("&nonceStr=").append(request.getNonceStr()) .append("&prepayId=").append(request.getPrepayId()) .append("&signType=").append(request.getSignType()) //时间戳:当前时间的十位数字,精确到秒 .append("×tamp=").append(request.getTimestamp()); return SignUtils.sign(sb.toString(), privateKey); } |
|
signType |
签名方法 | 是 | String | RSA | 加密方式 |
tradeType |
交易类型 | 是 | String | APP | 交易类型 |
scheme |
支付回调scheme | 是 | String | AndroidMainfest.xml配置的支付结果回调页面Data (例子:allinone://open/payResult 连信中: lx://open/payResult | |
mPackage |
需要接收支付回调页的APP 包名 | 是 | String | 例如:接收支付结果页的包名为(com.app.package) 连信中: com.zenmen.palmchat | |
isRedpacket |
是否是发红包 | 是 | String | "true"发红包 "false"支付 | |
timestamp |
时间戳 | 是 | String | 10位时间戳 | |
ext |
否 | 扩展字段 | |||
mext |
否 | 扩展字段 |
通知H5支付结果(钥匙浏览器)
//Message
Message.what = 128801;
Bundle bundle = new Bundle()
//data
//:{"errMsg":"","errCode":"0","ext":""}
bundle.putString("data", mData);
bundle.putString("callback", "paycb");
Message.obj = bundle ;
WkApplication.getObsever().dispatch(Message);
通知H5支付结果(WebView浏览器)
//msg:支付信息
//code:支付返回码
payCallback(msg,code);
支付返回码
支付回调页面或者支付码
if (getIntent() != null && getIntent().getExtras() != null) {
//返回码
int retcode = getIntent().getIntExtra("retcode", -10);
//返回信息
String remsg = (String) getIntent().getExtras().get("retmsg");
//返回的业务数据(不一定有数据,请自行判断空指针)
String data = (String) getIntent().getExtras().get("data");
}
返回码 | 返回信息 | 备注 |
---|---|---|
0 | 商户支付成功 | 不可作为最终的支付凭证,需商户异步查询支付结果 |
-1 | 支付中 | 需商户异步去查询最终的支付结果 |
-2 | 支付失败 | 可能错误:sign签名错误,uhid不匹配,连尚校验失败,其他异常 |
-3 | 用户取消 | 无需处理,用户不支付 |
-4 | 支付不支持 | 暂时没有用到,无需处理 |
-5 | 支付结果未知 | 商户需要主动调用订单查询接口,查询支付状态 |
-6 | 登陆失败 | 支付时登陆状态异常 |
-7 | 查询用户信息失败 | 查询用户实名和银行卡信息失败 |
-8 | 查询收银台接口失败 | 查询收银台接口发生错误或者失败 |
-9 | 查询零钱或者绑卡信息失败 | 查询零钱或者绑卡信息失败 |