zoukankan      html  css  js  c++  java
  • app支付接口(支付宝 微信)

    生成订单号

    public String getOutTradeNo() {
    SimpleDateFormat format = new SimpleDateFormat("MMddHHmmss",
    Locale.getDefault());
    Date date = new Date();
    String key = format.format(date);

    Random r = new Random();
    key = key + r.nextInt();
    key = key.substring(0, 15);
    return key;
    }

    加签名(支付宝)

    public boolean getSign(Result ret, OrderVo ord){
    out_trade_no = getOutTradeNo();
    //仅设置result的msg
    String orderInfo = getOrderInfo("xxxx", "xxxxx", out_trade_no, "0.01");
    String tmpsign = sign(orderInfo);
    try {
    // 仅需对sign 做URL编码
    tmpsign = URLEncoder.encode(tmpsign, "UTF-8");
    } catch (UnsupportedEncodingException e) {
    e.printStackTrace();
    ret.resp(404, "获取订单错误");
    return false;
    }
    sign = orderInfo + "&sign="" + tmpsign + ""&" + getSignType();
    return true;
    }

    public String sign(String content) {
    return SignUtils.sign(content, Config.RSA_PRIVATE);
    }

    public String getSignType() {
    return "sign_type="RSA"";
    }

    加签名 微信

    public boolean getSign(Result ret, OrderVo ord, String ip){
    //仅设置result的msg
    Map<String, String> restmap = null;
    boolean flag = true; // 是否订单创建成功
    try {
    String total_fee = BigDecimal.valueOf(0.01).multiply(BigDecimal.valueOf(100)).setScale(0, BigDecimal.ROUND_HALF_UP).toString();
    Map<String, String> parm = new HashMap<String, String>();
    parm.put("appid", Config.APP_ID);
    parm.put("mch_id", Config.MCH_ID);
    parm.put("device_info", "WEB"); //设备信息
    out_trade_no = WxPayUtil.getTradeNo();
    parm.put("nonce_str", WxPayUtil.getNonceStr());
    parm.put("body", "测试付费");
    parm.put("attach", "今日秀场"); //附加数据,如深圳分店
    parm.put("out_trade_no", out_trade_no);
    parm.put("total_fee", total_fee);
    parm.put("spbill_create_ip", ip);
    parm.put("notify_url", Config.FDBACK);
    parm.put("trade_type", "APP");
    parm.put("sign", WxPayUtil.getSign(parm, Config.API_SECRET));
    String restxml = HttpUtils.posts(Config.ORDER_PAY, XmlUtil.xmlFormat(parm, false));
    System.out.println("--"+restxml);
    restmap = XmlUtil.xmlParse(restxml);
    } catch (Exception e) {
    e.printStackTrace();
    ret.resp(404, "获取订单错误");
    return false;
    }

    prepayid = restmap.get("prepay_id");
    noncestr = WxPayUtil.getNonceStr();
    timestamp = WxPayUtil.payTimestamp();
    Map<String, String> payMap = new HashMap<String, String>();
    if (CollectionUtil.isNotEmpty(restmap) && "SUCCESS".equals(restmap.get("result_code"))) {
    payMap.put("appid", Config.APP_ID);
    payMap.put("partnerid", Config.MCH_ID);
    payMap.put("prepayid", prepayid);
    payMap.put("package", "Sign=WXPay");
    payMap.put("noncestr", noncestr);
    payMap.put("timestamp", timestamp);
    try {
    payMap.put("sign", WxPayUtil.getSign(payMap, Config.API_SECRET));
    sign = payMap.get("sign");
    } catch (Exception e) {
    e.printStackTrace();
    flag = false;
    }
    }
    if (flag) {
    return true;
    } else {
    return false;
    }
    }

    app端接口生成订单

    @POST
    @Path("/add")
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)
    @ApiOperation(value = "提交订单")
    @ApiResponses(value = { @ApiResponse(code = 700, message = "保存成功,但创建支付信息失败,需要重新调用支付接口") })
    public OrderAddResult addOrder(OrderVo order) {
    OrderAddResult ret = new OrderAddResult();
    User user = validateUser(ret, 0, 0);
    if (user == null) {
    return ret;
    }
    if(!order.add(ret, user)){
    return ret;
    }
    ret.resp(700, "保存订单成功");
    try{
    if(order.getPayType() == 1){

    if(order.getAlipay().getSign(ret, order)){
    order.setPaystate(0);
    Orders o=order.toModel();
    o.save();
    //order.updateAlipay();
    }else{
    return ret;
    }
    }else{
    //order.wxpay = new WxPay();
    if(order.getWxpay().getSign(ret, order, WxPayUtil.getRemoteAddrIp(getReq()))){
    //order.updateWxpay();
    order.setPaystate(0);
    Orders o=order.toModel();
    o.save();
    }else{
    return ret;
    }
    }
    }finally {
    ret.data = order;
    }
    return ret.resp(0, "创建订单成功");
    }

    最后验证支付结果

    @GET
    @Path("/result/validate/{id}")
    @Produces(MediaType.APPLICATION_JSON)
    @ApiOperation(value = "验证支付结果")
    public Result validate(@ApiParam(value = "订单id", required = true) @PathParam("id") long mid) {
    Result ret = new Result();
    User user = validateUser(ret, 0, 0);
    if (user == null) {
    return ret;
    }
    Orders order1 = Orders.getOrder(user.getId(), mid);//根据用户获取订单信息
    OrderVo order=order1.toVo();
    if(order == null){
    return ret.resp(103, "订单不存在");
    }
    if(order.getPayType() == 1){
    if(order.getAlipay() != null){
    int c = order.getAlipay().checkState(ret, order);
    if(c == 0){
    order.updateState(1);
    int co=user.updateCoins(order.getCoins());
    if(co==0){
    ret.resp(0,"充值成功");
    }
    }
    }else{
    ret.resp(107, "未找到支付信息");
    }
    }else{
    if(order.getWxpay() != null){
    int c = order.getWxpay().checkState(ret, order);
    if(c == 0){
    order.updateState(1);
    int co=user.updateCoins(order.getCoins());
    if(co==0){
    ret.resp(0,"充值成功");
    }
    }
    }else{
    ret.resp(107, "未找到支付信息");
    }
    }
    return ret;
    }

    微信验证支付状态

    public int checkState(Result ret, OrderVo order){
    Map<String, String> restmap = null;
    try {
    Map<String, String> parm = new HashMap<String, String>();
    parm.put("appid", Config.APP_ID);
    parm.put("mch_id", Config.MCH_ID);
    //parm.put("transaction_id", tradeid);
    parm.put("out_trade_no", out_trade_no);
    parm.put("nonce_str", WxPayUtil.getNonceStr());
    parm.put("sign", WxPayUtil.getSign(parm, Config.API_SECRET));
    String restxml = HttpUtils.post(Config.ORDER_PAY_QUERY, XmlUtil.xmlFormat(parm, false));
    /*
    SUCCESS—支付成功
    REFUND—转入退款
    NOTPAY—未支付
    CLOSED—已关闭
    REVOKED—已撤销(刷卡支付)
    USERPAYING--用户支付中
    PAYERROR--支付失败(其他原因,如银行返回失败)
    */
    restmap = XmlUtil.xmlParse(restxml);
    } catch (Exception e) {
    e.printStackTrace();
    ret.resp(500, "查询出错,请稍后再试");
    return 500;
    }
    if (CollectionUtil.isNotEmpty(restmap) && "SUCCESS".equals(restmap.get("result_code"))) {
    // 订单查询成功 处理业务逻辑

    String state = restmap.get("trade_state");
    if("NOTPAY".equals(state)){
    ret.resp(100, "未支付");
    }else if("SUCCESS".equals(state)){
    ret.resp(0, "订单支付成功");
    }else if("REVOKED".equals(state)){
    ret.resp(107, "已撤消(刷卡支付)");
    }else if("USERPAYING".equals(state)){
    ret.resp(100, "用户支付中");
    }else if("REFUND".equals(state)){
    ret.resp(100, "转入退款");
    }else if("CLOSED".equals(state)){
    ret.resp(107, "订单已关闭");
    }else{
    ret.resp(108, "未知错误");
    }
    //System.out.println("订单查询:订单" + restmap.get("out_trade_no") + "支付成功");
    } else {
    if (CollectionUtil.isNotEmpty(restmap)) {
    ret.resp(100, "订单支付失败:"+restmap.get("err_code")+"" + restmap.get("err_code_des"));
    }else{
    ret.resp(100, "订单支付失败");
    }
    }
    return ret.code;
    }

    支付宝验证支付状态方法

    public int checkState(Result ret,OrderVo order){
    AlipayClient client = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", Config.APPID, Config.RSA_PRIVATE,"json","UTF-8",Config.ALIPAY_PUBKEY);
    AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();
    Map<String, Object> maps = new HashMap<String, Object>();
    maps.put("out_trade_no", out_trade_no);
    request.setBizContent(Json.getGson().toJson(maps).replaceAll(" | | ", ""));
    try {
    AlipayTradeQueryResponse response = client.execute(request);
    System.out.println(Json.getGson().toJson(response));
    if("10000".equals(response.getCode())){
    String tradeState = response.getTradeStatus();
    if("WAIT_BUYER_PAY".equals(tradeState)){
    //等待付款
    ret.resp(100, "用户支付中");
    }else if("TRADE_CLOSED".equals(tradeState)){
    //未付款交易超时关闭,或支付完成后全额退款
    }else if("TRADE_SUCCESS".equals(tradeState)){
    //交易支付成功
    ret.resp(0, "订单支付成功");
    }else if("TRADE_FINISHED".equals(tradeState)){
    //交易结束,不可退款
    ret.resp(107, "交易结束,不可退款");
    }else{
    ret.resp(108, "未知状态错误");
    }
    }else{
    System.out.println(Json.getGson().toJson(response));
    ret.resp(500, "查询支付状态出错,请稍后再试");
    return 500;
    }
    } catch (AlipayApiException e) {
    e.printStackTrace();
    ret.resp(500, "查询出错,请稍后再试");
    return 500;
    }
    return ret.code;
    }

  • 相关阅读:
    关于android 代码生成布局中遇到的一些问题
    关于选择移动开发平台(android,ios,wp7)的一些看法
    如何成为一个C++高级程序员(转帖)
    最新Windows平台下Android源码的下载(转+原)
    峨眉之巅放歌
    孝感人间
    迁芸(帮客户名字作诗)
    载春
    杨美花(帮客户名字作诗)
    人生几度温泉夜
  • 原文地址:https://www.cnblogs.com/fengyifengceaser/p/6276780.html
Copyright © 2011-2022 走看看