微信的服务商模式开发,文档有很明确的说明,也有详细的开发文档,以及操作步骤。其实支付宝也是支付服务商模式的,只是比较影藏,今天在这里梳理一下。
在实现支付宝支付的时候,我们要先选择一种支付方式,这里和微信是一样的。
好了,那么对接完当面付之后,如何替商户发起支付呢??ok,看文档
https://opendocs.alipay.com/apis/api_1/alipay.trade.pay
seller_id:卖方PID
如果该值为空,则默认为商户签约账号对应的支付宝用户ID |
这是很含蓄的表达:意思就是如果为空,默认就是服务商的PID,不为空,才是商户的
找到途径之后,我们就只需要找到满足条件的商户PID,就可以完成支付了。
在这里帮你的商户,签约当面付,这里签约的时候,费率一定要填写0.6%,因为这里有惊喜哦^-^
签约成功之后,客户会收到签约确认邮件,登录确认就好。
官方文档:https://opendocs.alipay.com/open/20160728150111277227/intro
这里一定要注意:授权支付宝账号和之前签约的支付宝账号一定要是同一个
授权成功之后,在会在“我的商家”里面显示出来。
好了,准备工作到这里,基本上就可以实现服务商模式支付。签约的费率为什么要选择0.6%,因为支付宝的政策和微信的政策是一样的,我就不具体说明了,你懂的。。。。
聊点题话外,支付宝在这里还预留了业务扩展参数,这个可以根据自己和支付宝合作,而具体判断。
这里附上代码片段,有需要的同学,可以参考。
package com.pay.alipay.bo;
import java.util.HashMap;
import java.util.Map;
import javax.annotation.Resource;
import org.apache.commons.lang3.StringUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.fastquery.service.FQuery;
import org.springframework.stereotype.Component;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.domain.AlipayTradeWapPayModel;
import com.alipay.api.domain.ExtendParams;
import com.alipay.api.request.AlipayTradeCreateRequest;
import com.alipay.api.request.AlipayTradeWapPayRequest;
import com.alipay.api.response.AlipayTradeCreateResponse;
import com.db.PunitExternalDBService;
import com.pay.alipay.util.AlipayConfig;
import com.bean.PayOrder;
import com.bean.Punit;
import com.bean.PunitExternal;
import com.util.Config;
import net.sf.json.JSONObject;
/**
* 支付宝生成订单
*
* @author libaibai
* @version 1.0 2018年1月2日
*/
@Component
public class AlipayReqOrder {
private static final Logger LOG = LogManager.getLogger(AlipayReqOrder.class);
@Resource
GetAlipayOpenAuthTokenAppBo getAlipayOpenAuthTokenAppBo;
private PunitExternalDBService punitExternalDBService = FQuery.getRepository(PunitExternalDBService.class); //
/**
* 生成订单(手机网站支付)
* type 订单类型,0临停,1月票
*/
public String exe(PayOrder payOrder, String aliAppid, String rsaPrivateKey, String alipayPublicKey, String detail, double chargeMoney,
String body, String sellerId, int type) {
String out_trade_no = payOrder.getPayOrderId();
// 调用支付宝sdk,生成订单
AlipayClient client = new DefaultAlipayClient(AlipayConfig.URL, aliAppid, rsaPrivateKey, AlipayConfig.FORMAT, AlipayConfig.CHARSET,
alipayPublicKey, AlipayConfig.SIGNTYPE);
AlipayTradeWapPayRequest alipay_request = new AlipayTradeWapPayRequest();
// 封装请求支付信息
AlipayTradeWapPayModel model = new AlipayTradeWapPayModel();
model.setOutTradeNo(out_trade_no);
model.setSubject(detail);
model.setTotalAmount(chargeMoney + "");
model.setBody(body);
model.setProductCode(AlipayConfig.PRODUCT_CODE);
model.setSellerId(sellerId);
String quitUrl = "https://wx.deliyun.cn/pay?punitId=" + payOrder.getPunitId() + "&plateNum=" + payOrder.getPlateNum();;
if (type == 1) {
quitUrl = "https://wx.deliyun.cn/paymonth?punitId=" + payOrder.getPunitId() + "&plateNum=" + payOrder.getPlateNum();
}
model.setQuitUrl(quitUrl); // 支付中退出,跳转地址
// 获取授权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);
// 扩充参数
ExtendParams extendParams = new ExtendParams();
extendParams.setSysServiceProviderId(Config.ALIPAY_PID);
model.setExtendParams(extendParams);
alipay_request.setBizModel(model);
// 设置异步通知地址
alipay_request.setNotifyUrl(AlipayConfig.notify_url);
// 设置同步地址
alipay_request.setReturnUrl(AlipayConfig.return_url);
String formStr = null;
LOG.info("alipay_下单request=" + JSONObject.fromObject(alipay_request));
try {
formStr = client.pageExecute(alipay_request).getBody();
} catch (AlipayApiException e) {
LOG.error("alipay_下单失败", e);
return null;
}
LOG.info("alipay_下单成功,formStr=" + formStr);
return formStr;
}
/**
* 生成订单(当面付)
*/
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 map = new HashMap();
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 extendParamsMap = new HashMap();
extendParamsMap.put("sys_service_provider_id", sys_service_provider_id);
if (!StringUtils.isEmpty(alipayParkingId)) {
// promo_params参数
Map promoParamsMap = new HashMap();
promoParamsMap.put("parking_id", alipayParkingId);
map.put("promo_params", promoParamsMap);
// refluxInfo参数
Map refluxInfoMap = new HashMap();
Map sceneDataMap = new HashMap();
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(); // 交易号
}
}
获取到支付的交易号(tradeNo)后,可以在jsp页面,发起支付宝扣款
官方地址:https://opendocs.alipay.com/open/common/105591
// 支付宝当面付
function tradePay(userId) {
var iden = $("#iden").val();
var punitId = $("#punitId").val();
var chargeMoney = $("#chargeMoney").val();
var channelId = $("#channelId").val();
var outTime=$("#outTime").val();
$.tenetAjax({
url: PATH + "/punitWS/getAlipayParkOrder",
data: {'punitId':punitId,'iden':iden,'chargeMoney':chargeMoney, "userId":userId, "channelId":channelId, "outTime":outTime},
success: function(data){
if(data.payOrderMap==null){
$("#iformbtndID").html('支付失败,请返回重新进入');
return;
}
var isPay = data.payOrderMap.isPay;
var errorMsg = data.payOrderMap.errorMsg;
if(isPay==null || isPay==0){
alert(errorMsg);
$("#iformbtndID").html(''+errorMsg+'');
return;
} else if (isPay==2) {
$("#iformbtndID").html('支付成功
');
return;
}
var tradeNo = data.payOrderMap.tradeNo;
var payOrderId = data.payOrderMap.payOrderId;
if (tradeNo == null || tradeNo == "") {
alert("下单失败");
return false;
}
ready(function() {
AlipayJSBridge.call("tradePay", {
tradeNO : tradeNo
}, function(result) {
var data = JSON.stringify(result);
data = JSON.parse(data)
// 支付成功
if (data.resultCode == 9000) {
$("#iformbtndID").html('支付成功
');
var punitId = $("#punitId").val();
var stayTime = $("#outDelayID").text();
var unitName= $("#unitNameID").text();
var chargeMoney = $("#chargeMoney").val();
window.location.href="paysuc?punitId="+punitId+"&payOrderId="+payOrderId+"&stayTime="+stayTime+"&unitName="+unitName+"&payMoney="+chargeMoney;
} else {
// 支付失败
$("#iformbtndID").html('支付失败,请返回重新进入');
}
});
});
}
});
}
好了,到这里支付宝服务商模式支付,已经完成了。