Java 微信小程序自建平台开发票保存到微信卡包
- 1 获取Access token
- 2 获取自身的开票平台识别码
- 3 设置商户联系方式
- 4 获取授权页ticket
- 5 获取授权页链接
- 6 小程序打开授权页
- 7 收取授权完成事件推送
- 8 创建发票卡券模板
- 9 上传PDF
- 10 将电子发票卡券插入用户卡包
1 获取Access token
这里的appid和secret是公众号的,不要写小程序的。
获取 Access token
public static JSONObject getAccessToken() {
String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + gzhAppId + "&secret=" + gzhAppSecret;
return JSON.parseObject(HttpClientUtil.doGet(url));
}
2 获取自身的开票平台识别码
提前获取开票平台标识s_pappid,因为同一个开票平台的s_pappid都相同,所以获取s_pappid的操作只需要进行一次。只需创建一次,把卡劵s_pappid存起来。
获取自身的开票平台识别码
/**
* 获取自身的开票平台识别码
*/
public static JSONObject getInvoicePlatformIdentifyCode(String accessToken) {
String url = String.format("https://api.weixin.qq.com/card/invoice/seturl?access_token=%s", accessToken);
return JSON.parseObject(HttpClientUtil.doPost(url, new HashMap<>()));
}
3 设置商户联系方式
注意,本步骤不能忽略,否则将造成下一步获取授权页报错。
设置商户联系方式
/**
* 设置商户联系方式
*/
public static JSONObject setContact(String accessToken, Map<String, Object> params) {
String url = String.format("https://api.weixin.qq.com/card/invoice/setbizattr?action=set_contact&access_token=%s", accessToken);
return JSON.parseObject(HttpUtil.post(url, JSONObject.toJSONString(params)));
}
4 获取授权页ticket
获取授权页ticket
/**
* 获取授权页ticket
*/
public static JSONObject getAuthTicket(String accessToken) {
String url = String.format("https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=%s&type=wx_card", accessToken);
return JSON.parseObject(HttpClientUtil.doGet(url));
}
5 获取授权页链接
获取授权页url,上一步获取的授权页ticket将作为参数传入。另外,本环节里面作为参数传入的order_id要注意保留,传递给开票平台作为向用户提供电子发票的依据。这里的授权页type=2(领取发票类型):用于商户发票已开具成功,拉起授权页后让用户将发票归集保存到卡包。
获取授权页链接
/**
* 获取授权页链接
*/
public static JSONObject getAuthUrl(String accessToken, Map<String, Object> params) {
String url = String.format("https://api.weixin.qq.com/card/invoice/getauthurl?access_token=%s", accessToken);
return JSON.parseObject(HttpUtil.post(url, JSONObject.toJSONString(params)));
}
6 小程序打开授权页
获得的授权页url(auth_url)作为传入参数,拉起微信客户端打开授权页。
小程序打开授权页
wx.navigateToMiniProgram({
appId: '{appid}',
path: '{auth_url}',
success(res) {
console.log('navigateToMiniProgram success:', res)
},
fail(error){
console.log('navigateToMiniProgram fail:', error)
},
complete(res){
console.log('navigateToMiniProgram complete:', res)
}
})
7 收取授权完成事件推送
后台等待接收用户的授权完成事件。需要在微信公众平台上配置授权回调地址URL。用户同意授权将发票存入微信卡包后,微信会将发票的order_id通过回调地址URL推送过来,拿到order_id后可以查询具体的开票信息数据,然后上传发票PDF到微信,再将电子发票卡券插入用户卡包。
收取授权完成事件推送
/**
* 微信公众号消息回调 get方法用于微信鉴权
* @param signature 微信的签名,需要与自己生成的签名进行比对,相同则成功
* @param timestamp 时间戳
* @param nonce
* @param echostr
*/
@GetMapping("/callback")
public String validate(@RequestParam(value = "signature", required = false) String signature,
@RequestParam(value = "timestamp", required = false) String timestamp,
@RequestParam(value = "nonce", required = false) String nonce,
@RequestParam(value = "echostr", required = false) String echostr) {
try {
log.info("签名开始");
boolean flag = weChatService.verifyUrl(signature, timestamp, nonce, echostr);
if (flag) {
log.info("callbackCheckPass");
return echostr;
}
log.info("callbackCheckFailure");
return "error";
} catch (Exception e) {
log.info("callbackCheckFailure", e);
return "error";
}
}
/**
* 处理具体的回调信息
*/
@PostMapping("/callback")
public String callback(@RequestParam(name = "signature", required = false) String signature,
@RequestParam(name = "timestamp", required = false) String timestamp,
@RequestParam(name = "nonce", required = false) String nonce,
@RequestParam(name = "echostr", required = false) String echostr,
@RequestParam(name = "openid", required = false) String openid,
@RequestBody String msg) {
log.info("处理具体的回调信息");
log.info("======微信回调msg======:" +msg);
try {
weChatService.handleWxCallBackMsg(msg, signature, timestamp, nonce, echostr, openid);
return "success";
} catch (Exception e) {
log.info("handleWxCallBackMsg", e);
return "error";
}
}
8 创建发票卡券模板
只需创建一次,把卡劵id card_id 存起来。
创建发票卡券模板
9 上传PDF
上传发票PDF文件。此步骤获得的s_media_id起到关联PDF和发票卡券的作用,将作为参数在下一步的插卡接口中传入。
上传PDF
/**
* 将电子发票PDF文件上传至微信
*/
public static String uploadPdfFile(String accessToken, File file) {
String url = "https://api.weixin.qq.com/card/invoice/platform/setpdf?access_token=" + accessToken;
try {
RequestBody requestBody = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("pdf", file.getName(), RequestBody.create(MediaType.parse("application/pdf"), file))
.build();
Request request = new Request.Builder()
.url(url)
.post(requestBody)
.build();
Response response = new OkHttpClient().newCall(request).execute();
if (response.isSuccessful()) {
JSONObject jsonObject = JSONObject.parseObject(response.body().string());
if (jsonObject.getInteger("errcode") == 0) {
return jsonObject.getString("s_media_id");
}
}
return null;
} catch (Exception e) {
log.info("调用微信上传PDF接口异常");
e.printStackTrace();
return null;
}
}
10 将电子发票卡券插入用户卡包
将电子发票添加到用户微信卡包。
将电子发票卡券插入用户卡包
/**
* 将电子发票卡券插入用户卡包
*/
public static JSONObject invoiceInsert(String accessToken, Map<String, Object> params) {
String url = String.format("https://api.weixin.qq.com/card/invoice/insert?access_token=%s", accessToken);
return JSON.parseObject(PostUtil.postJson(url, JSONObject.toJSONString(params)));
}
将上面的每一个步骤完成后,具体业务代码自己编写,就可以将发票保存到微信卡包。
参考博客:
1 小程序自建平台开发票保存到微信卡包(java篇)
2 自建平台模式:小程序开票
3 开票平台接口列表
4 商户接口列表