Java 使用Spring控制器处理Paypal IPN请求?
我想扩展Spring应用程序的功能,包括一个HTTP端点来接收Paypal即时支付通知 Paypal在HTTP正文中发送这些内容,如下所示: mc_gross=19.95和保护_资格=合格和地址_状态=已确认和付款人_id=LPLWNMTBWMFAY和税务=0.00和地址_street=1+Main+St&payment_日期=20%3A12%3A59+Jan+13%2C+2009+PST&payment_状态=已完成和charset=windows-1252和地址_zip=95131&first_姓名=测试和mc费用=0.88和地址_国家代码=美国和地址_姓名=测试+通知版本=2.6和付款人_状态=已验证和地址\国家=美国+美国和地址\城市=圣何塞和数量=1和验证\符号=AtkOfCXbDm2hu0ZELryHFjY-Vb7PAUvS6nMXgysbElEn9v-1XcmSoGtf和付款人\电子邮件=gpmac \ 1231902590 \每%40paypal.com和txn \ id=61E6768CH3238416和支付\类型=即时和最后一个\姓名=用户和地址\州=CA和接收人\电子邮件=gpmac \ 1231902686\商业%40paypal.com和支付id=0.88=S8XGHLYDW9T3S&txn\u类型=快速付款和项目名称=&mc\u货币=美元和项目编号=&residence\u country=美国和测试\u ipn=1&处理金额=0.00&交易主题=&payment\u gross=19.95&装运=0.00 我需要定义一个具体的类来定义请求主体吗 请求类Java 使用Spring控制器处理Paypal IPN请求?,java,spring,spring-mvc,paypal,Java,Spring,Spring Mvc,Paypal,我想扩展Spring应用程序的功能,包括一个HTTP端点来接收Paypal即时支付通知 Paypal在HTTP正文中发送这些内容,如下所示: mc_gross=19.95和保护_资格=合格和地址_状态=已确认和付款人_id=LPLWNMTBWMFAY和税务=0.00和地址_street=1+Main+St&payment_日期=20%3A12%3A59+Jan+13%2C+2009+PST&payment_状态=已完成和charset=windows-1252和地址_zip=95131&firs
public class PaypalIPNRequest {
private static final long serialVersionUID = 1L;
private String mc_gross;
private String protection_eligibility;
private String address_street;
...
public PaypalIPNRequest() {
}
//getters setters
}
控制器
@Override
@Auditable
@RequestMapping(value = "/ipnRequest.do", method = RequestMethod.POST)
@ResponseStatus(value = HttpStatus.OK)
public void ipnRequest(@RequestBody final PaypalIPNRequest request) {
}
如本SO答复所述:
如果Paypal在未来更改其IPN请求,会发生什么情况,这会中断吗
有没有更好的方法在不使用特定类的情况下传递请求正文
我可以使用HttpServletRequest吗?我过去所做的是使用
com.paypal.base.ipn.IPNMessage
来验证并从请求中检索对我来说很重要的字段,而不是将整个请求体映射到具体的类,例如:
private final static String PAYPAL_WEB_IPN_TXN_PARAM = "txn_id";
private final static String PAYPAL_WEB_IPN_AMOUNT_PARAM = "mc_gross";
private final static String PAYPAL_WEB_IPN_PAYMENT_STATUS_PARAM = "payment_status";
private final static String PAYPAL_WEB_IPN_PAYMENT_STATUS = "Completed";
@Resource(name = "payPalConfigurationMap")
private Map<String, String> configurationMap;
private OAuthTokenCredential oAuthTokenCredential;
@PostConstruct
public void init() {
Properties properties = new Properties();
properties.putAll(configurationMap);
PayPalResource.initConfig(properties);
oAuthTokenCredential = new OAuthTokenCredential(
configurationMap.get(Constants.CLIENT_ID),
configurationMap.get(Constants.CLIENT_SECRET),
configurationMap
);
}
public DonationDTO validateWebIPN(HttpServletRequest request) throws Exception {
IPNMessage ipnlistener = new IPNMessage(request, configurationMap);
boolean isIpnVerified = ipnlistener.validate();
String paymentStatus = ipnlistener.getIpnValue(PAYPAL_WEB_IPN_PAYMENT_STATUS_PARAM);
if (isIpnVerified && paymentStatus.equalsIgnoreCase(PAYPAL_WEB_IPN_PAYMENT_STATUS)) {
String amount = ipnlistener.getIpnValue(PAYPAL_WEB_IPN_AMOUNT_PARAM);
String tx = ipnlistener.getIpnValue(PAYPAL_WEB_IPN_TXN_PARAM);
// irrelevant code
return donationDTO;
}else{
String exceptionMessage = "Problem when requesting info from PayPal service";
logger.error(exceptionMessage);
throw new Exception(exceptionMessage);
}
}
private final静态字符串PAYPAL_WEB_IPN_TXN_PARAM=“TXN_id”;
私有最终静态字符串PAYPAL_WEB_IPN_AMOUNT_PARAM=“mc_gross”;
私有最终静态字符串PAYPAL_WEB_IPN_PAYMENT_STATUS_PARAM=“PAYMENT_STATUS”;
私有最终静态字符串PAYPAL\u WEB\u IPN\u PAYMENT\u STATUS=“已完成”;
@资源(name=“payPalConfigurationMap”)
私有地图配置地图;
专用OAuthTokenCredential OAuthTokenCredential;
@施工后
公共void init(){
属性=新属性();
properties.putAll(配置图);
PayPalResource.initConfig(属性);
oAuthTokenCredential=新的oAuthTokenCredential(
configurationMap.get(Constants.CLIENT_ID),
configurationMap.get(常数.CLIENT_SECRET),
配置图
);
}
公共捐赠到ValidateWebIP(HttpServletRequest请求)引发异常{
IPN消息ipnlistener=新IPN消息(请求、配置映射);
布尔值isIpnVerified=ipnlistener.validate();
字符串paymentStatus=ipnlistener.getIpnValue(PAYPAL\u WEB\u IPN\u PAYMENT\u STATUS\u参数);
如果(isIpnVerified&&paymentStatus.equalsIgnoreCase(PAYPAL\u WEB\u IPN\u PAYMENT\u状态)){
字符串amount=ipnlistener.getIpnValue(PAYPAL\u WEB\u IPN\u amount\u参数);
字符串tx=ipnlistener.getIpnValue(PAYPAL_WEB_IPN_TXN_参数);
//无关代码
归还捐赠给;
}否则{
String exceptionMessage=“从PayPal服务请求信息时出现问题”;
logger.error(异常消息);
抛出新异常(exceptionMessage);
}
}
这样,除非Paypal更改字段名称(这不应该发生),否则您不应该有任何问题。只是为了澄清,这是在Spring控制器中还是您自己创建的类?这是我自己的类。我有一个用
@RestController
注释的类,它从Paypal接收IPN请求,并调用上面的方法,该方法位于另一个带有@Service
的类中。谢谢,有点离题,但您在处理IPN请求时使用了什么内容类型。我从Spring收到HTTP 415错误,我使用了MediaType.APPLICATION\u FORM\u URLENCODED
。