PixelPay 通过Java处理订单

发布于 2019-08-28  3770 次阅读


通过这篇文章,你可以了解到通过Java处理PixelPay订单的流程

要创建订单,你需要拥有以下信息

  • SID
  • 玩家名
  • 金额
  • 支付方式名
  • (可选)礼包名

支付方式和支付方式名对应如下表(因为支付宝二维码支付暂未完工,所以不在下方列出)

微信ddm_wechat_all
QQddm_tencent_all

在集齐了上方信息以后,创建URL,传递上方的参数,并打开连接,括号内参数选填

http://vexrmb.i8mc.cn/index.php/Doserverpay/create.html?id=SID&playername=玩家名&money=金额&payway=支付方式(&kit=礼包名)

例如 http://vexrmb.i8mc.cn/index.php/Doserverpay/create.html?id=1&playername=Test&money=1&payway=ddm_wechat_all

就是在SID为1的服务器上,为Test玩家创建一个使用微信支付的金额为1元的订单

打开连接后会返回一个html文件,你可以通过下方java代码来获取具体的订单信息

public HashMap<String, String> getPageCode(String host) {
        HashMap<String, String> reason = new HashMap<>();
        try {
            URL url = new URL(host);
            URLConnection connection = url.openConnection();
            InputStream is = connection.getInputStream();
            InputStreamReader isr = new InputStreamReader(is, "utf-8");
            BufferedReader bf = new BufferedReader(isr);

            String text;
            StringBuffer sb = new StringBuffer();
            while ((text = bf.readLine()) != null) {
                sb.append(text);
            }
            Pattern pattern = Pattern.compile("<dl class=\"dl-horizontal\">        <dt>.*</dl>    <hr>    <dl class=\"dl-horizontal\">");
            Matcher matcher = pattern.matcher(sb);
            String mes = null;
            while (matcher.find()) {
                mes = matcher.group();
            }
            if (mes != null) {
                return getArgs(mes);
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return reason;
    }

    public HashMap<String, String> getArgs(String mes) {
        HashMap<String, String> reason = new HashMap<>();
        if (mes != null) {
            String[] fg = mes.replace("<dl class=\"dl-horizontal\">        <dt>", "")
                    .replace("</b></dd>    </dl>    <hr>    <dl class=\"dl-horizontal\">", "")
                    .replace("<em>←若未注册充值系统, 建议保存</em>", "").split("</dd>        <dt>");
            for (String i : fg) {
                String[] value = i.split("</dt>        <dd>");
                switch (value[0]) {
                    case "订单号":
                        reason.put("%order%", value[1]);
                        break;
                    case "下单时间":
                        reason.put("%create_time%", value[1]);
                        break;
                    case "充值金额":
                        reason.put("%money%", value[1]);
                        break;
                    case "支付方式":
                        reason.put("%type%", value[1]);
                        break;
                    case "充值服务器":
                        reason.put("%server%", value[1]);
                        break;
                    case "充值账号":
                        reason.put("%user%", value[1]);
                        break;
                    case "支付订单号":
                        reason.put("%ddmorder%", value[1].substring(3));
                    default:
                        break;
                }
            }
        }
        return reason;
    }

调用方法 getPageCode 你可以获得一个Map,调用该Map的get("%order%"),你会得到订单号的字符串

String url = "http://vexrmb.i8mc.cn/index.php/Doserverpay/create.html?id=1&playername=Test&money=1&payway=ddm_wechat_all";
Map<String,String> tmp = getPageCode(url);
String order = tmp.get("%order%");

则变量order就是该订单的订单号

获取了订单号之后,你就可以获得该支付方式对应的二维码图片

创建URL http://vexrmb.i8mc.cn/index.php/api/getWechatQRCode?id=SID&key=Key&order=订单号 通过ImageIO.read()方法,即可读取到该订单号的支付二维码。

在支付完成后,你可以通过WebAPI的s_orders函数,获取所有支付成功,未发货的订单,再进行发货,并调用s_ship函数,标记已发货的订单,即可完成订单周期。

注意,在这里所有涉及到的网络连接,建议均使用异步进行操作,否则会造成不必要的卡顿甚至崩溃

关于异步操作,在这里只简单介绍

 new BukkitRunnable() {
    @Override
    public void run() {
        //TODO 你需要异步操作的代码
    }
}.runTaskAsynchronously(plugin)

使用上方的代码,即最简单的进行异步操作,其他的不过多解释


一个全世界最菜的菜鸡