微信的服务商模式开发,文档有很明确的说明,也有详细的开发文档,以及操作步骤。其实支付宝也是支付服务商模式的,只是比较影藏,今天在这里梳理一下。
一、如何选择支付类型??
在实现支付宝支付的时候,我们要先选择一种支付方式,这里和微信是一样的。
一般的作为后台开发者,我们首选手机网站支付,因为这个不仅是H5页面可以发起支付,以后也可以嵌套在APP里面,这样APP就不用二次开发了。
但是坑来了,当我们打开当面付的api以后,就会发现问题了。
如上图:
手机网站支付是不支持第三方调用的,但是当面付可以。换句话说,就是手机网站支付不支持服务商,当面付才支持服务商模式。
好长时间才发现,这个坑。
二、如何替商户发起支付??
好了,那么对接完当面付之后,如何替商户发起支付呢??ok,看文档
https://opendocs.alipay.com/apis/api_1/alipay.trade.pay
seller_id:卖方PID
如果该值为空,则默认为商户签约账号对应的支付宝用户ID |
这是很含蓄的表达:意思就是如果为空,默认就是服务商的PID,不为空,才是商户的
找到途径之后,我们就只需要找到满足条件的商户PID,就可以完成支付了。
三、如何发展商户?
1、登录网址:https://p.alipay.com/workspace/home
2、运营中心-->商家签约管理
在这里帮你的商户,签约当面付,这里签约的时候,费率一定要填写0.6%,因为这里有惊喜哦^-^
签约成功之后,客户会收到签约确认邮件,登录确认就好。
3、客户授权
官方文档:https://opendocs.alipay.com/open/20160728150111277227/intro
这里一定要注意:授权支付宝账号和之前签约的支付宝账号一定要是同一个
授权成功之后,在会在“我的商家”里面显示出来。
好了,准备工作到这里,基本上就可以实现服务商模式支付。签约的费率为什么要选择0.6%,因为支付宝的政策和微信的政策是一样的,我就不具体说明了,你懂的。。。。
四、业务扩展
聊点题话外,支付宝在这里还预留了业务扩展参数,这个可以根据自己和支付宝合作,而具体判断。
这里附上代码片段,有需要的同学,可以参考。
public String exe(PayOrder payOrder, String aliAppid, String rsaPrivateKey, String alipayPublicKey, String detail, double chargeMoney,
String body, String sellerId, String userId, int isSpAliPay, Punit punit) {
String out_trade_no = payOrder.getPayOrderId();
// 调用支付宝sdk,生成订单
AlipayClient client = new DefaultAlipayClient(AlipayConfig.URL, aliAppid, rsaPrivateKey, AlipayConfig.FORMAT, AlipayConfig.CHARSET,
alipayPublicKey, AlipayConfig.SIGNTYPE);
AlipayTradeCreateRequest alipay_request = new AlipayTradeCreateRequest();
Map<String, Object> map = new HashMap<String, Object>();
map.put("out_trade_no", out_trade_no);
map.put("subject", detail);
map.put("total_amount", chargeMoney);
map.put("body", body);
map.put("seller_id", sellerId);
map.put("buyer_id", userId); // 买家pid
map.put("timeout_express", "10m"); // 最晚支付时间10分钟
// 德立云参数
String sys_service_provider_id = Config.ALIPAY_PID;
String alipayParkingId = punit.getAlipayParkingId(); // 支付宝停车场
// 云纵参数
try {
PunitExternal punitExternal = punitExternalDBService.findByPunitId(payOrder.getPunitId());
if (punitExternal != null && !StringUtils.isEmpty(punitExternal.getParkingId())) {
sys_service_provider_id = Config.YUNZOU_PID;
alipayParkingId = punitExternal.getParkingId(); // 支付宝停车场
}
} catch (Exception e1) {
LOG.error("获取停车场合作参数失败", e1);
}
// extendParams参数
Map<String, Object> extendParamsMap = new HashMap<String, Object>();
extendParamsMap.put("sys_service_provider_id", sys_service_provider_id);
if (!StringUtils.isEmpty(alipayParkingId)) {
// promo_params参数
Map<String, Object> promoParamsMap = new HashMap<String, Object>();
promoParamsMap.put("parking_id", alipayParkingId);
map.put("promo_params", promoParamsMap);
// refluxInfo参数
Map<String, Object> refluxInfoMap = new HashMap<String, Object>();
Map<String, Object> sceneDataMap = new HashMap<String, Object>();
refluxInfoMap.put("scene_code", "parking_fee_order");
refluxInfoMap.put("channel", "common_park_provider");
sceneDataMap.put("license_plate", payOrder.getPlateNum());
sceneDataMap.put("start_time", payOrder.getInTime());
sceneDataMap.put("parking_lot_id", alipayParkingId);
sceneDataMap.put("parkling_lot_name", punit.getUnitName());
sceneDataMap.put("city_code", punit.getCity());
refluxInfoMap.put("scene_data", sceneDataMap);
String refluxInfoString = JSONObject.fromObject(refluxInfoMap).toString();
extendParamsMap.put("industry_reflux_info", refluxInfoString);
}
map.put("extend_params", extendParamsMap);
// 必须传递,生成订单之后,用H5调起支付宝
if (isSpAliPay == 1) {
// 获取授权token
String authToken = getAlipayOpenAuthTokenAppBo.getAuthToken(sellerId);
if (StringUtils.isEmpty(authToken)) {
LOG.error("alipay_支付宝获取authToken失败,sellerId=" + sellerId);
return null;
}
alipay_request.putOtherTextParam("app_auth_token", authToken);
}
alipay_request.setBizContent(JSONObject.fromObject(map).toString());
// 设置异步通知地址
alipay_request.setNotifyUrl(AlipayConfig.notify_url);
// 设置同步地址
alipay_request.setReturnUrl(AlipayConfig.return_url);
AlipayTradeCreateResponse response = null;
try {
response = client.execute(alipay_request);
} catch (AlipayApiException e) {
LOG.error("alipay_支付宝下单失败");
}
LOG.info("alipay_下单成功,response=" + JSONObject.fromObject(response).toString());
// 返回参数jsapi 需要的参数
return response.getTradeNo(); // 交易号
}
JSAPI支付地址:https://opendocs.alipay.com/open/common/105591
好了,到这里支付宝服务商模式支付,已经完成了。