Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

车主服务3.0 #234

Open
wants to merge 2 commits into
base: 2.8.x
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
178 changes: 178 additions & 0 deletions src/main/java/weixin/popular/api/VehicleAPI.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,178 @@
package weixin.popular.api;

import java.nio.charset.Charset;
import java.util.Map;

import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.client.methods.RequestBuilder;
import org.apache.http.entity.StringEntity;

import weixin.popular.bean.vehicle.NavigateToOpenNoSense;
import weixin.popular.bean.vehicle.NavigateToOpenService;
import weixin.popular.bean.vehicle.PartnerpayNotification;
import weixin.popular.bean.vehicle.PartnerpayNotificationResult;
import weixin.popular.bean.vehicle.PartnerpayPayApply;
import weixin.popular.bean.vehicle.PartnerpayPayApplyResult;
import weixin.popular.bean.vehicle.PartnerpayQueryState;
import weixin.popular.bean.vehicle.PartnerpayQueryStateResult;
import weixin.popular.bean.vehicle.enums.TradeScene;
import weixin.popular.client.LocalHttpClient;
import weixin.popular.util.JsonUtil;
import weixin.popular.util.MapUtil;
import weixin.popular.util.SignatureUtil;
import weixin.popular.util.XMLConverUtil;

/**
* 车主服务,只实现车主服务特有的接口,其他支付相关的接口和普通微信支付一样,调用PayMchAPI即可
*
* 接口文档
* https://pay.weixin.qq.com/wiki/doc/api/vehicle_v2_sl.php?chapter=2_3&index=1
*
* @author around
*
*/
public class VehicleAPI extends BaseAPI {

/**
* 入场通知
*
* @param notification
* @param key
* @return
*/
public static PartnerpayNotificationResult partnerpayNotification(PartnerpayNotification notification, String key) {
Map<String, String> map = MapUtil.objectToMap(notification);
if (notification.getScene_info() != null) {
map.put("scene_info", "{\"scene_info\":" + JsonUtil.toJSONString(notification.getScene_info()) + "}");
}
String sign = SignatureUtil.generateSign(map, notification.getSign_type(), key);
notification.setSign(sign);
String xml = XMLConverUtil.convertToXML(notification);
HttpUriRequest httpUriRequest = RequestBuilder.post().setHeader(xmlHeader)
.setUri(MCH_URI + "/vehicle/partnerpay/notification")
.setEntity(new StringEntity(xml, Charset.forName("utf-8"))).build();
return LocalHttpClient.executeXmlResult(httpUriRequest, PartnerpayNotificationResult.class,
notification.getSign_type(), key);
}

/**
* 扣款请求
*
* @param apply
* @param key
* @return
*/
public static PartnerpayPayApplyResult partnerpayPayApply(PartnerpayPayApply apply, String key) {
Map<String, String> map = MapUtil.objectToMap(apply);
if (apply.getScene_info() != null) {
map.put("scene_info", "{\"scene_info\":" + JsonUtil.toJSONString(apply.getScene_info()) + "}");
}
String sign = SignatureUtil.generateSign(map, apply.getSign_type(), key);
apply.setSign(sign);
String xml = XMLConverUtil.convertToXML(apply);
HttpUriRequest httpUriRequest = RequestBuilder.post().setHeader(xmlHeader)
.setUri(MCH_URI + "/vehicle/partnerpay/payapply")
.setEntity(new StringEntity(xml, Charset.forName("utf-8"))).build();
return LocalHttpClient.executeXmlResult(httpUriRequest, PartnerpayPayApplyResult.class, apply.getSign_type(),
key);
}

/**
* 查询用户状态
*
* @param query
* @param key
* @return
*/
public static PartnerpayQueryStateResult partnerpayQueryState(PartnerpayQueryState query, String key) {
Map<String, String> map = MapUtil.objectToMap(query);
String sign = SignatureUtil.generateSign(map, query.getSign_type(), key);
query.setSign(sign);
String xml = XMLConverUtil.convertToXML(query);
HttpUriRequest httpUriRequest = RequestBuilder.post().setHeader(xmlHeader)
.setUri(MCH_URI + "/vehicle/partnerpay/querystate")
.setEntity(new StringEntity(xml, Charset.forName("utf-8"))).build();
return LocalHttpClient.executeXmlResult(httpUriRequest, PartnerpayQueryStateResult.class, query.getSign_type(),
key);
}

/**
* <a href=
* "https://pay.weixin.qq.com/wiki/doc/api/pap_sl_jt_v2.php?chapter=20_932&index=10">跳转到小程序/H5/APP,用户授权/开通车主服务</a>
*
* @param path
* @param tradeScene
* @param appid
* @param subAppid
* @param mchid
* @param subMchid
* @param openid
* @param subOpenid
* @param plateNumber
* @param materialInfo
* @param channelType
* @param key
* @return
*/
public static NavigateToOpenService navigateToOpenService(String path, TradeScene tradeScene, String appid,
String subAppid, String mchid, String subMchid, String openid, String subOpenid, String plateNumber,
String materialInfo, String channelType, String key) {
NavigateToOpenService nav = new NavigateToOpenService();
nav.setPath(path);
NavigateToOpenService.ExtraData extraData = new NavigateToOpenService.ExtraData();
extraData.setAppid(appid);
extraData.setSub_appid(subAppid);
extraData.setMch_id(mchid);
extraData.setSub_mch_id(subMchid);
extraData.setTrade_scene(tradeScene);
extraData.setOpenid(openid);
extraData.setSub_openid(subOpenid);
extraData.setChannel_type(channelType);
extraData.setMaterial_info(materialInfo);
extraData.setPlate_number(plateNumber);
extraData.setNonce_str(String.valueOf(System.currentTimeMillis()));
Map<String, String> map = MapUtil.objectToMap(extraData);
extraData.setSign(SignatureUtil.generateSign(map, key));
nav.setExtraData(extraData);
return nav;
}

public static NavigateToOpenNoSense navigateToOpenNoSense(String appid, String subAppid, String mchid,
String subMchid, String openid, String plateNumber, String key) {
NavigateToOpenNoSense nav = new NavigateToOpenNoSense();
NavigateToOpenNoSense.ExtraData extraData = new NavigateToOpenNoSense.ExtraData();
extraData.setAppid(appid);
extraData.setSub_appid(subAppid);
extraData.setMch_id(mchid);
extraData.setSub_mch_id(subMchid);
extraData.setOpenid(openid);
extraData.setPlate_number(plateNumber);
extraData.setNonce_str(String.valueOf(System.currentTimeMillis()));
Map<String, String> map = MapUtil.objectToMap(extraData);
extraData.setSign(SignatureUtil.generateSign(map, key));
nav.setExtraData(extraData);
return nav;
}

/**
* 支付中开通车主服务,需要申请开通权限
*
* @param oldAttach
* @param plateNumber
* @param appid
* @return 下单时附加字段attach的字符串
*/
public static String getAttachToOpenServiceOnPaying(String oldAttach, String plateNumber, String appid) {
return String.format("#*#{\"pn\":\"%s\",\"aid\":\"%s\"}#*#%s", plateNumber, appid, oldAttach);
}

/**
* 在支付凭证中显示车主服务
*
* @param oldAttach
* @return
*/
public static String getAttachToShowVehicleServiceInPayOrder(String oldAttach) {
return String.format("#*#{\"vm\":\"true\"}#*#%s", oldAttach);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,137 @@
package weixin.popular.bean.vehicle;

import java.util.Map;

import weixin.popular.util.MapUtil;

/**
* <a href=
* "https://pay.weixin.qq.com/wiki/doc/api/pap_sl_jt_v2.php?chapter=20_932&index=10">跳转到小程序/H5/APP,用户授权/开通接口api</a>
*
* @author around
*
*/
public class NavigateToAppForAuthExtraData {

private String appid;
private String sub_appid;
private String mch_id;
private String sub_mch_id;
private String nonce_str;
private String sign_type = "HMAC-SHA256";
private String sign;
private String openid;
private String sub_openid;
private String trade_scene;
private String plate_number;
private String material_info;
private String channel_type;

public final String getAppid() {
return appid;
}

public final void setAppid(String appid) {
this.appid = appid;
}

public final String getSub_appid() {
return sub_appid;
}

public final void setSub_appid(String sub_appid) {
this.sub_appid = sub_appid;
}

public final String getMch_id() {
return mch_id;
}

public final void setMch_id(String mch_id) {
this.mch_id = mch_id;
}

public final String getSub_mch_id() {
return sub_mch_id;
}

public final void setSub_mch_id(String sub_mch_id) {
this.sub_mch_id = sub_mch_id;
}

public final String getNonce_str() {
return nonce_str;
}

public final void setNonce_str(String nonce_str) {
this.nonce_str = nonce_str;
}

public final String getSign_type() {
return sign_type;
}

public final void setSign_type(String sign_type) {
this.sign_type = sign_type;
}

public final String getSign() {
return sign;
}

public final void setSign(String sign) {
this.sign = sign;
}

public final String getTrade_scene() {
return trade_scene;
}

public final void setTrade_scene(String trade_scene) {
this.trade_scene = trade_scene;
}

public final String getOpenid() {
return openid;
}

public final void setOpenid(String openid) {
this.openid = openid;
}

public final String getSub_openid() {
return sub_openid;
}

public final void setSub_openid(String sub_openid) {
this.sub_openid = sub_openid;
}

public final String getPlate_number() {
return plate_number;
}

public final void setPlate_number(String plate_number) {
this.plate_number = plate_number;
}

public final String getMaterial_info() {
return material_info;
}

public final void setMaterial_info(String material_info) {
this.material_info = material_info;
}

public final String getChannel_type() {
return channel_type;
}

public final void setChannel_type(String channel_type) {
this.channel_type = channel_type;
}

public Map<String,String> toMap(){
return MapUtil.objectToMap(this);
}
}
Loading