獲取微信發(fā)票功能
流程概述:
發(fā)起請(qǐng)求:初始化IWXAPI->IWXAPI.sendReq(ChooseCardFromWXCardPackage.Req)
接收:需要WXEntryActivity->onResp(BaseResp resp){ChooseCardFromWXCardPackage.Resp cardResp = (ChooseCardFromWXCardPackage.Resp) resp;}
與H5的JS交互:JS調(diào)用安卓:JsCallAndroid->getInvoice() {WXInvoiceUtils.getInvoice();}
安卓回傳JS: WebView.evaluateJavascript(“javascript:window.PostWxInvoiceList(DATA)”, callBack);
1. 初始化IWXAPI
像支付一樣,需要先初始化IWXAPI,定義全局變量 private IWXAPI wechat;
public void initWechat(Activity context,String wxAppid) {
if (null == wechat) {
wechat = WXAPIFactory.createWXAPI(context.getApplicationContext(), wxAppid, true);
boolean isSuccsee = wechat.registerApp(wxAppid);
Log.e("initWechat","isSuccsee"+isSuccsee)
}
}
2. 發(fā)起獲取發(fā)票請(qǐng)求
請(qǐng)求方法:IWXAPI.sendReq(ChooseCardFromWXCardPackage.Req );
ChooseCardFromWXCardPackage.Req 參數(shù)配置方法如下:
/**
* 發(fā)起獲取發(fā)票請(qǐng)求
*/
public static void getInvoice() {
//時(shí)間戳
String timeStamp = String.valueOf(System.currentTimeMillis() / 1000);
ChooseCardFromWXCardPackage.Req req = new ChooseCardFromWXCardPackage.Req();
//微信開發(fā)者賬號(hào)appId
req.appId = wxAppid;
//類型:獲取發(fā)票
req.cardType = "INVOICE";
//隨機(jī)字符串
req.nonceStr = timeStamp;
//時(shí)間戳
req.timeStamp = timeStamp;
//簽名類型SHA1
req.signType = "SHA1";
req.locationId = "";
req.cardId = "";
req.canMultiSelect = "1";
//簽名
req.cardSign = createSign(req.appId, req.nonceStr, req.nonceStr, req.cardType);
wechat.sendReq(req);
}
3. 生成請(qǐng)求微信簽名信息
利用SortedMap 保存并排序app_id,nonce_str,card_type,time_stamp等參數(shù),然后進(jìn)行SHA1加密。
/**
* 微信支付簽名算法sign
*/
private static String createSign(String appId, String nonceStr, String timestamp, String card_type) {
SortedMap<Object, Object> parameters = new TreeMap<>();
parameters.put("app_id", appId);
parameters.put("nonce_str", nonceStr);
parameters.put("card_type", timestamp);
parameters.put("time_stamp", card_type);
StringBuffer sb = new StringBuffer();
Set es = parameters.entrySet();
// 所有參與傳參的參數(shù)按照accsii排序(升序)
Iterator it = es.iterator();
while (it.hasNext()) {
@SuppressWarnings("rawtypes")
Map.Entry entry = (Map.Entry) it.next();
String k = (String) entry.getKey();
Object v = entry.getValue();
if (null != v && !"".equals(v) && !"sign".equals(k)
&& !"key".equals(k)) {
sb.append(k + "=" + v + "&");
}
}
String sign = shaEncode(sb.toString()).toUpperCase();
return sign;
}
4. Java SHA1實(shí)現(xiàn)方法
/**
* SHA1實(shí)現(xiàn)
*
* @author haojy
* 2020年7月29日
*/
public static String shaEncode(String inStr) {
MessageDigest sha = null;
try {
sha = MessageDigest.getInstance("SHA");
} catch (Exception e) {
System.out.println(e.toString());
e.printStackTrace();
return "";
}
byte[] byteArray = new byte[0];
try {
byteArray = inStr.getBytes("UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
byte[] md5Bytes = sha.digest(byteArray);
StringBuffer hexValue = new StringBuffer();
for (int i = 0; i < md5Bytes.length; i++) {
int val = ((int) md5Bytes[i]) & 0xff;
if (val < 16) {
hexValue.append("0");
}
hexValue.append(Integer.toHexString(val));
}
return hexValue.toString();
}
5. 接收返回?cái)?shù)據(jù)
需要注意WXEntryActivity位置,需要放到app包名的Pageage下
public class WXEntryActivity extends Activity implements IWXAPIEventHandler {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
WechatManager.getInstance().getApi().handleIntent(getIntent(), this);
}
@Override
public void onReq(BaseReq baseReq) {
}
//發(fā)送到微信請(qǐng)求的響應(yīng)結(jié)果
@Override
public void onResp(BaseResp resp) {
if (resp instanceof ChooseCardFromWXCardPackage.Resp) {
ChooseCardFromWXCardPackage.Resp cardResp = (ChooseCardFromWXCardPackage.Resp) resp;
SPUtils.getInstance().put("CardItemList", cardResp.cardItemList);
}
finish();
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
WechatManager.getInstance().getApi().handleIntent(intent, this);
finish();
}
}
————————————————
原文鏈接:https://blog.csdn.net/hjy258/article/details/109021271