上一篇介绍了 对接微信电子发票的功能 里面大致介绍了业务逻辑 环境配置 和一部分核心代码 https://www.jianshu.com/p/51810ed2f0fc 今天来实现对接支付宝的电子发票功能
业务场景差不多 第三方app唤醒 支付宝的电子发票列表 选择发票 导入第三方app 现在让我们跟着官方文档来进行开发吧
1 请求链接
支付宝的电子发票功能 是通过外部scheme链接来调用的 请求链接可以通过webview的方式加载 其中请求链接 由两部分组成 根据官方文档的说明 https://docs.open.alipay.com/10691/bv8s88 完整的链接包括有 发票输出链接(调用支付宝app的链接)+ 发票输出回调链接 (支付宝把选择的数据返回给app) 构造请求链接 有特定的组合要求 支付宝发票输出组件固定链接地址为:/www/invoiceSelect.htm?scene=#发票输出业务场景#&einvMerchantId=#企业标志#&serverRedirectUrl=#步骤1中urlEncode后的发票输出回调地址#
![](https://img.haomeiwen.com/i16483549/72ac2943e1132a13.png)
//唤起支付宝固定链接
String url="https://render.alipay.com/p/s/i?appId=20000920&startMultApp=YES&url=";
//ISV回调地址
String isvUrl="http://html.qingyuko.com/ticket2.html";
//编码之后的ISV回调地址
String encodeIsvUrl=UrlUtils.encode(isvUrl);
//发票输出组件固定链接
String alipayUrl="/www/invoiceSelect.htm?scene=INVOICE_EXPENSE&einvMerchantId=9131000074027295XF&serverRedirectUrl="+encodeIsvUrl;
//编码之后的发票输出组件链接
String encodeAlipayUrl=UrlUtils.encode(alipayUrl);
//唤起发票输出组件的完整链接
String alipayLandingUrl=url+encodeAlipayUrl;
注意url中的appid是固定的支付宝发票功能的数据 不是我们申请的那个appid ,其中配置发票回调的链接可以使用scheme协议的方式 提前在需要接收数据的activity 的mainfest文件中 配置 相关数据
![](https://img.haomeiwen.com/i16483549/459aaaf1e43352aa.png)
其中xxx 就是schme协议中链接地址 一般都是应用的名称缩写,这样配置好之后 回调链接地址为xxx:// 最后组合好之后的链接格式如下图所示
![](https://img.haomeiwen.com/i16483549/e7ddfc4e9aa46e2a.png)
2 加载链接
一般可以使用webview进行加载 本人的项目中因为使用了cordova的框架 cordova的框架对于外部链接有诸多限制 最明显的便是白名单的拦截 在调试的过程中出现了 URL blocked by whitelist 所以需要对链接进行筛选
![](https://img.haomeiwen.com/i16483549/0b45256caf607a8d.png)
需要在shouldOverrideUrlLoading的方法中对 链接进行拦截处理
else if (url.startsWith("alipays://")){
try {
// scheme跳转到支付宝
final Intent intent =new Intent(Intent.ACTION_VIEW,
Uri.parse(url));
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
| Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(intent);
}catch (Exception e) {
// 防止没有安装的情况
e.printStackTrace();
}
return true;
}
alipays:// 就是支付宝app的scheme协议中应用名称 这个是固定写死的
经过这两个步骤就能够打开支付宝的发票列表界面了
3 选择发票数据回调
网友评论