Java 微信小程序自建平台开发票保存到微信卡包

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 商户接口列表

评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值