package com.unionpay.acp.demo.acp7Contract;

import com.unionpay.acp.demo.DemoUtil;
import com.unionpay.acp.sdk.Acp7Service;
import com.unionpay.acp.sdk.SDKConfig;
import org.apache.log4j.Logger;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;

/**
 * 交易状态查询
 * 声明：以下代码只是为了方便商户测试而提供的样例代码，商户可以根据自己需要，按照技术文档编写。该代码仅供参考，不提供编码，性能，规范性等方面的保障<br>
 * 更多问题请使用open网站查找，开放平台-帮助与支持-商户入网测试FAQ，https://open.unionpay.com/tjweb/support/faq/mchlist
 */
public class Demo10_Trade_Query {

    private final static Logger logger = Logger.getLogger(Demo10_Trade_Query.class);

    private String bizMethod;
    private String url;

    public Demo10_Trade_Query(String bizMethod, String url) {
        this.bizMethod = bizMethod;
        this.url = url;
    }

    public static void main(String[] s) {
        Demo10_Trade_Query demo = new Demo10_Trade_Query("acp.trade.query", SDKConfig.getConfig().getV7TransUrl());
        Map<String, String> reqMap;
        Map<String, String> rspMap;

        Map<String, String> reqData = new TreeMap<String, String>();

        /***产品参数***/
        reqData.put("version", "7.0.1");                 //版本号
        reqData.put("signMethod", "RSA2");               //签名方法
        reqData.put("bizMethod", demo.bizMethod);        //交易类型

        /***商户接入参数***/
        reqData.put("appId", SDKConfig.getValueFromConfig("appId"));      //发送方系统索引号
        reqData.put("appType", SDKConfig.getValueFromConfig("appType"));                 //01机构、02商户
        reqData.put("reqId", DemoUtil.getReqId());    //发送方流水号，可以自行定制规则

        /***业务参数***/
        Map<String, Object> bodyMap = new HashMap<String, Object>();
        //TODO 以下参数请按真实情况填写
        bodyMap.put("accessType", SDKConfig.getValueFromConfig("accessType")); //1机构，0商户
        bodyMap.put("acqInsCode", SDKConfig.getValueFromConfig("acqInsCode"));//收单机构代码,机构接入必填
        bodyMap.put("merId", SDKConfig.getValueFromConfig("merId")); //商户号，请修改为自己的商户号
        bodyMap.put("orderId", DemoUtil.getOrderId()); //商户订单号，8-32位数字字母，不能含“-”或“_”，可以自行定制规则，此处为演示方便默认取了个值
        bodyMap.put("txnTime", DemoUtil.getTxnTime());//订单发送时间，格式为yyyyMMddHHmmss，取北京时间，此处为演示方便默认取了个值

        reqData.put("body", JSONObject.wrap(bodyMap).toString());

        /**对请求参数进行签名并发送http post请求，接收同步应答报文**/
        reqMap = Acp7Service.sign(reqData);      //报文中sign,signId的值是在sign方法中获取并自动赋值的，只要证书配置正确即可。
        rspMap = Acp7Service.post(reqMap, demo.url);  //发送请求报文并接受同步应答（默认连接超时时间30秒，读取返回结果超时时间30秒）;这里调用sign之后，调用post之前不能对map中的键值对做任何修改，如果修改会导致验签不通过

        /***应答处理***/
        if (rspMap == null || rspMap.size() == 0) {
            logger.info("post失败，请看下日志文件。");
            return;
        }

        if (!Acp7Service.validate(rspMap)) {
            logger.info("验签失败");
            return;
        }

        Map<String, Object> rspBody;
        try {
            if (rspMap.containsKey("body")) {
                rspBody = DemoUtil.unwarpJson(new JSONObject(rspMap.get("body")));
                String code = (String) rspBody.get("code");
                if (!("0000000000").equals(code)) {
                    String msg = (String) rspBody.get("msg");
                    StringBuffer stringBuffer = new StringBuffer();
                    stringBuffer.append("返回了失败应答：code=" + code + "，msg=" + msg);
                    String subMsg = (String) rspBody.get("subMsg");
                    String subCode = (String) rspBody.get("subCode");
                    if (subCode != null) {
                        stringBuffer.append("，subCode=" + subCode + "，subMsg=" + subMsg);
                    }
                    logger.info(stringBuffer.toString());
                    return;
                }

                return;
            }
        } catch (JSONException e) {
            logger.info("应答体解json失败。");//正常不会进这个逻辑
            return;
        }

    }

}
