net.shopxx.plugin.tenpayDirectPayment.TenpayDirectPaymentPlugin.java Source code

Java tutorial

Introduction

Here is the source code for net.shopxx.plugin.tenpayDirectPayment.TenpayDirectPaymentPlugin.java

Source

/*
 * Copyright 2005-2015 shopxx.net. All rights reserved.
 * Support: http://3936242.01p.com/
 * License: http://3936242.01p.com/license
 */
package net.shopxx.plugin.tenpayDirectPayment;

import java.math.BigDecimal;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;

import javax.servlet.http.HttpServletRequest;

import net.shopxx.entity.PaymentLog;
import net.shopxx.entity.PluginConfig;
import net.shopxx.plugin.PaymentPlugin;

import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.lang.StringUtils;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
import org.springframework.stereotype.Component;

@Component("tenpayDirectPaymentPlugin")
public class TenpayDirectPaymentPlugin extends PaymentPlugin {

    @Override
    public String getName() {
        return "(?)";
    }

    @Override
    public String getVersion() {
        return "1.0";
    }

    @Override
    public String getAuthor() {
        return "xiaohe";
    }

    @Override
    public String getSiteUrl() {
        return "http://3936242.01p.com/";
    }

    @Override
    public String getInstallUrl() {
        return "tenpay_direct_payment/install.jhtml";
    }

    @Override
    public String getUninstallUrl() {
        return "tenpay_direct_payment/uninstall.jhtml";
    }

    @Override
    public String getSettingUrl() {
        return "tenpay_direct_payment/setting.jhtml";
    }

    @Override
    public String getRequestUrl() {
        return "https://gw.tenpay.com/gateway/pay.htm";
    }

    @Override
    public PaymentPlugin.RequestMethod getRequestMethod() {
        return PaymentPlugin.RequestMethod.get;
    }

    @Override
    public String getRequestCharset() {
        return "UTF-8";
    }

    @Override
    public Map<String, Object> getParameterMap(String sn, String description, HttpServletRequest request) {
        PluginConfig pluginConfig = getPluginConfig();
        PaymentLog paymentLog = getPaymentLog(sn);
        Map<String, Object> parameterMap = new HashMap<String, Object>();
        parameterMap.put("trade_mode", "1");
        parameterMap.put("partner", pluginConfig.getAttribute("partner"));
        parameterMap.put("input_charset", "utf-8");
        parameterMap.put("sign_type", "MD5");
        parameterMap.put("return_url", getNotifyUrl(PaymentPlugin.NotifyMethod.sync));
        parameterMap.put("notify_url", getNotifyUrl(PaymentPlugin.NotifyMethod.async));
        parameterMap.put("out_trade_no", sn);
        parameterMap.put("subject",
                StringUtils.abbreviate(description.replaceAll("[^0-9a-zA-Z\\u4e00-\\u9fa5 ]", ""), 30));
        parameterMap.put("body",
                StringUtils.abbreviate(description.replaceAll("[^0-9a-zA-Z\\u4e00-\\u9fa5 ]", ""), 30));
        parameterMap.put("bank_type", "DEFAULT");
        parameterMap.put("seller_id", pluginConfig.getAttribute("partner"));
        parameterMap.put("total_fee", paymentLog.getAmount().multiply(new BigDecimal(100)).setScale(0).toString());
        parameterMap.put("fee_type", "1");
        parameterMap.put("spbill_create_ip", request.getLocalAddr());
        parameterMap.put("attach", "shopxx");
        parameterMap.put("sign", generateSign(parameterMap));
        return parameterMap;
    }

    @Override
    public boolean verifyNotify(PaymentPlugin.NotifyMethod notifyMethod, HttpServletRequest request) {
        PluginConfig pluginConfig = getPluginConfig();
        PaymentLog paymentLog = getPaymentLog(request.getParameter("out_trade_no"));
        if (paymentLog != null && generateSign(request.getParameterMap()).equals(request.getParameter("sign"))
                && pluginConfig.getAttribute("partner").equals(request.getParameter("partner"))
                && "0".equals(request.getParameter("trade_state"))
                && paymentLog.getAmount().multiply(new BigDecimal(100))
                        .compareTo(new BigDecimal(request.getParameter("total_fee"))) == 0) {
            try {
                Map<String, Object> parameterMap = new HashMap<String, Object>();
                parameterMap.put("input_charset", "utf-8");
                parameterMap.put("sign_type", "MD5");
                parameterMap.put("partner", pluginConfig.getAttribute("partner"));
                parameterMap.put("notify_id", request.getParameter("notify_id"));
                String verifyUrl = "https://gw.tenpay.com/gateway/simpleverifynotifyid.xml?input_charset=utf-8&sign_type=MD5&partner="
                        + pluginConfig.getAttribute("partner") + "&notify_id=" + request.getParameter("notify_id")
                        + "&sign=" + generateSign(parameterMap);
                Document document = new SAXReader().read(new URL(verifyUrl));
                Node node = document.selectSingleNode("/root/retcode");
                if ("0".equals(node.getText().trim())) {
                    return true;
                }
            } catch (DocumentException e) {
                throw new RuntimeException(e.getMessage(), e);
            } catch (MalformedURLException e) {
                throw new RuntimeException(e.getMessage(), e);
            }
        }
        return false;
    }

    @Override
    public String getSn(HttpServletRequest request) {
        return request.getParameter("out_trade_no");
    }

    @Override
    public String getNotifyMessage(PaymentPlugin.NotifyMethod notifyMethod, HttpServletRequest request) {
        if (PaymentPlugin.NotifyMethod.async.equals(notifyMethod)) {
            return "Success";
        }
        return null;
    }

    private String generateSign(Map<String, ?> parameterMap) {
        PluginConfig pluginConfig = getPluginConfig();
        return DigestUtils.md5Hex(joinKeyValue(new TreeMap<String, Object>(parameterMap), null,
                "&key=" + pluginConfig.getAttribute("key"), "&", true, "sign")).toUpperCase();
    }

}