Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Spring控制器处理Paypal IPN请求?_Java_Spring_Spring Mvc_Paypal - Fatal编程技术网

Java 使用Spring控制器处理Paypal IPN请求?

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

我想扩展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

我需要定义一个具体的类来定义请求主体吗

请求类

    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