前几步跳转至微信app获取和选择数电发票、回调至数电票系统均正常,但是数电票系统得到回调数据后,根据数据信息调用微信官方api查询时报错,单张获取发票和批量获取发票接口的错误代码均为72031,见下方截图(代码主要逻辑说明见下方代码,参考的微信官方api文档链接地址见本文档末附)。但是微信接口文档中对于这个参数说明太笼统,开发者社区中也未找到解决方案,当前问题没什么线索也不知道该怎么推进了,烦请协助支持! 感谢!!!
附接口文档地址:
https://developers.weixin.qq.com/doc/service/api/invoice/reimburser/api_invoicebxgetinvoice.html (获取单张发票信息)
附主要代码如下:
package com.seconddev.demo.shudianpiao;
import java.util.UUID;
import java.util.Formatter;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.io.UnsupportedEncodingException;
class GetInvoice {
public static void main(String[] args) {
// 涉密信息已隐藏
// 1、获取token,保存好后续要用
// curl "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=公众号APPID&secret=公众号APPSecret"
// 2、根据第一步token,替换到参数中,获取ticket
// curl "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=95_Mh8u5dnNnNOaYs3I6iSxzfWhgSdSnUdgKcmM25mUS7acd4hAKiCLq3qpD9fHRmViLO_anYyuH00AJcVmHjSGFL2Ml0uvpZbotcCssGZ58E4M3qiAJYXKNox90ZcEQYbAGAZLT&type=wx_card"
// 3、构建调用发票助手的参数
// api_ticket为第2步请求返回的数据
String api_ticket = "m7RQzjA_ljjEkt-JCoklRASszIYmWRSaGDTpTp4TssFx6_j_ymqOxdXFNHHy6w-9QCnopTNYC-7mbieRjnl9-g";
// 公众号appid
String appid = "公众号APPID";
String timestamp = create_timestamp();
String nonceStr = create_nonce_str();
String cardType = "INVOICE";
System.out.println("timestamp: "+timestamp);
System.out.println("nonceStr: "+nonceStr);
String sha1Para = api_ticket+appid+timestamp+nonceStr+cardType;
String cardSign = getSha1(sha1Para);
System.out.println("sha1Para: "+sha1Para);
System.out.println("cardSign: "+cardSign);
// 4、将第三部各个参数,拼接成js语法,放在移动端H5页面中执行,跳转到微信发票助手后,选择发票确认,跳回到H5页面后,会打印出刚选择的发票信息。
String wxCmd = "wx.invoke(\"chooseInvoice\", {\n" +
" \"signType\": \"SHA1\",\n" +
" \"cardSign\": \""+cardSign+"\",\n" +
" \"timestamp\": \""+timestamp+"\",\n" +
" \"nonceStr\": \""+nonceStr+"\"\n" +
"}, function(res){\n" +
" console.warn(res);\n" +
"});";
System.out.println("wxCmd: \n"+wxCmd);
// 5、将第4步中打印的发票信息,替换到下方参数,再把第一步的token放到URL后的参数,请求的结果还是72031,所以到这一步不知道该怎么处理了。
/* **
curl \
-X POST "https://api.weixin.qq.com/card/invoice/reimburse/getinvoiceinfo?access_token=95_Mh8u5dnNnNOaYs3I6iSxzfWhgSdSnUdgKcmM25mUS7acd4hAKiCLq3qpD9fHRmViLO_anYyuH00AJcVmHjSGFL2Ml0uvpZbotcCssGZ58E4M3qiAJYXKNox90ZcEQYbAGAZLT" \
-H "Content-Type: application/json" -d '{"card_id":"p4gLgvro6c38LZUPaunHDQ-7EKFA","encrypt_code":"O/mPnGTpBu22a1szmK2ogzhFPBh9eYzv2p70L8yzyym1CRfkhxMspMBRj11hxaPiV4c6gjAxpjFpuMw1cbebm3MJqxKn0tOhpJvYY6njIi5JfHipN2vo4GpcSYmF9u+x"}'
*/
};
public static String getSha1(String p){
String signSha1 = "";
try
{
MessageDigest crypt = MessageDigest.getInstance("SHA-1");
crypt.reset();
crypt.update(p.getBytes("UTF-8"));
signSha1= byteToHex(crypt.digest());
}
catch (NoSuchAlgorithmException e)
{
e.printStackTrace();
}
catch (UnsupportedEncodingException e)
{
e.printStackTrace();
}
return signSha1;
}
private static String byteToHex(final byte[] hash) {
Formatter formatter = new Formatter();
for (byte b : hash)
{
formatter.format("%02x", b);
}
String result = formatter.toString();
formatter.close();
return result;
}
private static String create_nonce_str() {
return UUID.randomUUID().toString();
}
private static String create_timestamp() {
return Long.toString(System.currentTimeMillis() / 1000);
}
}

请求的时间贴下, 或者重新触发一次, 贴下请求时间和响应的内容