저지에서 Alipay 비동기 콜백 알림 문제 처리: java.lang.IllegalArgumentException: 미디어 유형 'application/x-www-form-urlencoded; text/html, charset=UTF-8' 구문 분석 오류

4572 단어 신청
 
tcpflow는 요청 내용을 흐름 단위로 분석하므로 서버 측 인터페이스 서비스가 문제를 확인하는 데 매우 적합합니다.
이번에 발생한 문제는 Alipay 결제 후 콜백 포스트 결과와 관련이 있습니다.
타오바오 코드 예시:

    public void doPost(HttpServletRequest request, HttpServletResponse response)throws UnsupportedEncodingException {
        //»ñµÃ´ýÇ©ÃûÊý¾ÝºÍÇ©ÃûÖµ
        String sign = URLDecoder.decode(request.getParameter("sign"),"utf-8");
        String content = URLDecoder.decode(request.getParameter("content"),"utf-8");
        
서버는 저지를 사용하고 @FormParam 유형 매개변수를 직접 사용하고 게시 요청을 수신하지만 콘텐츠를 처리할 수 없고 로그에 오류가 표시됩니다.
java.lang.IllegalArgumentException: 미디어 유형 'application/x-www-form-urlencoded, text/html, charset=UTF-8' 구문 분석 오류
curl을 사용하여 application/x-www-form-urlencoded가 구문 분석 가능한지 테스트합니다.
curl -d 'sign=1¬ify_data=yest' "https://passport.ishuangshuang.com/credits/order/notify"
내 코드가 지원되지 않기 때문이라고 생각하여 예제에 따라 서버 측 코드를 다음과 같이 변경했습니다.

code2:
public String verify(@Context HttpServletRequest request) { Map map = request.getParameterMap(); log.info("[alipay] callback,map="+map); String sign = (String) ((Object[]) map.get("sign"))[0]; String verifyData = (String) ((Object[]) map.get("notify_data"))[0];
여전히 같은 오류
tshark를 사용하여 패킷을 캡처하면 명령줄에서 직접 스트림 콘텐츠를 보기 위해 Follow stream을 사용할 수 없으므로 install tcpflow, yum install -y tcpflow
tcpflow -p dst port 8280 명령을 사용하여 8280에서 수신된 요청의 흐름 로그를 생성합니다.

X-Host: xxx.com
X-Forwarded-Proto: https
Content-Type: application/x-www-form-urlencoded; text/html; charset=UTF-8
User-Agent: Mozilla/4.0
Host: xxx.com
Content-Length: 1135
LOGID: 5762503519760285696
CLIENTIP: 110.75.141.3
X-FORWARDED-FOR: 110.75.141.3

sign=mYJtdB2XmD57ReoLQkhMhUpIxmMLQltfs0opq%2Bl3prGzkA9xckxpqKMBy7vAHfCZe3ryJq1VoJxBpAv6KsaAarCn2tfcLt2EClfrZDoL967xPzLcz%2BmddlEe7ST4CHvOYg4jNaJBpxEYoDnDTmK3Rk7x%2FbfmJZwulA8OOjqGHac%3D&sign_type=RSA&notify_data=%3Cnotify%3E%3Cpartner%3E2088901361787590%3C%2Fpartner%3E%3Cdiscount%3E0.00%3C%2Fdiscount%3E%3Cpayment_type%3E1%3C%2Fpayment_type%3E%3Csubject%3E%E7%A7%AF%E5%88%86%E8%B4%AD%E4%B9%B0%3C%2Fsubject%3E%3Ctrade_no%3E2013071530259116%3C%2Ftrade_no%3E%3Cbuyer_email%3E13811437730%3C%2Fbuyer_email%3E%3Cgmt_create%3E2013-07-15+19%3A30%3A59%3C%2Fgmt_create%3E%3Cquantity%3E1%3C%2Fquantity%3E%3Cout_trade_no%3E100027%3C%2Fout_trade_no%3E%3Cseller_id%3E2088901361787590%3C%2Fseller_id%3E%3Ctrade_status%3ETRADE_FINISHED%3C%2Ftrade_status%3E%3Cis_total_fee_adjust%3EN%3C%2Fis_total_fee_adjust%3E%3Ctotal_fee%3E0.01%3C%2Ftotal_fee%3E%3Cgmt_payment%3E2013-07-15+19%3A31%3A01%3C%2Fgmt_payment%3E%3Cseller_email%3Ezhifubao%40fanxer.com%3C%2Fseller_email%3E%3Cgmt_close%3E2013-07-15+19%3A31%3A01%3C%2Fgmt_close%3E%3Cprice%3E0.01%3C%2Fprice%3E%3Cbuyer_id%3E2088502632932163%3C%2Fbuyer_id%3E%3Cuse_coupon%3EN%3C%2Fuse_coupon%3E%3C%2Fnotify%3E
두 가지 질문:
1 실제로 Content-Type에 문제가 있어 저지를 인식할 수 없고 구문 분석할 수 없습니다. "Content-Type: application/x-www-form-urlencoded; text/html; charset=UTF-8"저지는 유형을 application으로 구문 분석한 다음 구분 기호 "/"를 읽습니다. x-www-form-urlencoded는 하위 유형이고, 구분자가 "="가 아니고 인식할 수 없기 때문에 후속 값은 parameterMap "text/html"입니다. HttpHeaderReader.nextSeparator는 오류를 보고합니다. alipay용 저지 소스 코드를 수정할 수 없나요?
2 별도의 저지 포스트 어노테이션 방식의 경우 타오바오의 자바 예제에 따라 파라미터를 처리할 수 없으며 get 방식의 url에 추가한 후 code2 방식으로만 처리할 수 있다.
검색 Alipay 알림, Google은 유효한 정보를 얻지 못합니다.
클라이언트 아웃소싱 동료가 제공한 패키지 이름인 Alipay ws_secure_pay를 검색하여 튜토리얼을 찾으면 Alipay 포럼 http://club.alipay.com/thread-htm-fid-로 이동해야 합니다. 703.html
 
저지 방식은 소비를 쓰지 않는 것으로 판명되었으며 기본값은 */*이지만 여전히 여러 유형을 인식할 수 없으며 서블릿은 콘텐츠 유형을 처리하지 않습니다. 결국 서블릿을 사용하여 결제를 구현합니다. Taobao 예에 따른 프로세스.

좋은 웹페이지 즐겨찾기