支付宝(移动支付)服务端java版

所需支付宝jar包: sdk2-2.0.jar(点击下载)

工具类目录结构:   点击下载

商户信息已经公钥私钥的配置(公钥私钥的生成与支付宝商户平台配置请看官方文档:https://doc.open.alipay.com/doc2/detail.htm?spm=a219a.7629140.0.0.nBDxfy&treeId=58&articleId=103242&docType=1https://doc.open.alipay.com/docs/doc.htm?spm=a219a.7629140.0.0.BfaKdz&treeId=58&articleId=103578&docType=1),

AlipayConfig

package com.rpframework.module.common.pay.alipay.config;

public class AlipayConfig {

    //↓↓↓↓↓↓↓↓↓↓请在这里配置您的基本信息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
    // 合作身份者ID,以2088开头由16位纯数字组成的字符串
    public static String partner = "2088...";
    // 商户的私钥
    public static String private_key = "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAKXcJq3Aj7uwht...";
public static String seller_email = "2088...";

    // 支付宝的公钥
    public static String ali_public_key  = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCnxj/9qwVfgoUh/y2W89...";
//↑↑↑↑↑↑↑↑↑↑请在这里配置您的基本信息↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

    // 调试用,创建TXT日志文件夹路径
    public static String log_path = "D:\\";

    // 字符编码格式 目前支持 gbk 或 utf-8
    public static String input_charset = "utf-8";

    // 签名方式
    public static String sign_type = "RSA";

}
PayUtils
package com.textile.util;

import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.rpframework.module.common.pay.alipay.config.AlipayConfig;
import com.rpframework.module.common.pay.alipay.util.SignUtils;import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;

/**
 *
 * 支付基本信息
 * @author zhangli
 * @date 2016年3月28日 下午2:35:24
 *
 *
 * 1.需要支付的信息  :
 *         用户支付  支付相关业务 支付金额  回调业务
 * 2.第三方支付需要的信息:
 *         trade_no,subject,body,total_fee,notify_url
 *
 */
public class PayUtils {
    public static String sign(String content, String RSA_PRIVATE) {
        return SignUtils.sign(content, RSA_PRIVATE);
    }
    /**
     * 支付宝支付
     * @param trade_no 订单号
     * @param total_fee 金额
     * @param subject 标题
     * @param body 内容
     * @param notify_url 回调地址
     * @param callback
     * @return
     * @throws UnsupportedEncodingException
     */
    public static String AliPay(
            String trade_no,    //订单号
            Double total_fee,   //金额
            String subject,    //标题
            String body,      //内容
            String notify_url   //回调哪个方法
         ) throws UnsupportedEncodingException{
        JsonObject json = new JsonObject();
        String orderInfo = "_input_charset=\"utf-8\"";
        orderInfo += "&body=" + "\"" + body + "\"";
        orderInfo += "&it_b_pay=\"30m\"";
        orderInfo += "&notify_url=" + "\"" + AlipayConfig.notifyURL+notify_url + "\"";
        orderInfo += "&out_trade_no=" + "\"" + trade_no + "\"";
        orderInfo += "&partner=" + "\"" + AlipayConfig.partner + "\"";
        orderInfo += "&payment_type=\"1\"";
        orderInfo += "&return_url=\"" + AlipayConfig.notifyURL+notify_url + "\"";
        orderInfo += "&seller_id=" + "\"" + AlipayConfig.seller_email + "\"";
        orderInfo += "&service=\"mobile.securitypay.pay\"";
        orderInfo += "&subject=" + "\"" + subject + "\"";
        String format = String.format("%.2f", total_fee);
        if(format.indexOf(",")>0)format = format.replace(",", ".");
        orderInfo += "&total_fee=" + "\"" + format+"\"";
        System.out.println(orderInfo);
        String sign = sign(orderInfo, AlipayConfig.private_key);
        sign = URLEncoder.encode(sign, "utf-8");
        final String payInfo = orderInfo + "&sign=\"" + sign + "\"&" + "sign_type=\"RSA\"";return payInfo;
    }
}

接口controller:

package com.textile.controller;

import com.rpframework.core.json.FailException;
import com.rpframework.core.json.JsonResp;
import com.rpframework.core.json.ParameterException;
import com.rpframework.module.common.bottom.controller.BaseController;
import com.rpframework.module.common.pay.alipay.util.AlipayNotify;
import com.rpframework.module.common.url.RequestDescription;
import com.textile.dto.MoneyDto;
import com.textile.entity.MemberIntroduction;
import com.textile.entity.MoneyRecord;
import com.textile.entity.User;
import com.textile.service.MemberIntroductionService;
import com.textile.service.MoneyRecordService;
import com.textile.service.UserService;
import com.textile.util.PayUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletRequest;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.math.BigDecimal;
import java.util.*;

/**
 * Created by bin on 2016/11/16.
 */
@ResponseBody
@Controller
@RequestMapping
public class MoneyController {

    //http://139.224.42.24:8899
    //http://tt.tunnel.2bdata.com
    public static String alinotify = "/api/json/money/alipay/succ";

    @RequestMapping
    @RequestDescription("支付宝支付回调地址")
    @Transactional(rollbackFor = Throwable.class)
    public String alipaySucc(HttpServletRequest request) throws IOException {
        System.out.println("支付宝回调");
        Map<String, String> params = new HashMap<>();
        Map<String, String[]> requestParams = request.getParameterMap();
        for (Iterator<String> iter = requestParams.keySet().iterator(); iter.hasNext();) {
            String name = iter.next();
            String[] values = requestParams.get(name);
            String valueStr = "";
            for (int i = 0; i < values.length; i++) {
                valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ",";
            }
            // 乱码解决,这段代码在出现乱码时使用。如果mysign和sign不相等也可以使用这段代码转化
            // valueStr = new String(valueStr.getBytes("ISO-8859-1"), "gbk");
            params.put(name, valueStr);
        }
        //String out_trade_no = request.getParameter("out_trade_no");// 商户订单号

        //获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(以下仅供参考)//
        //商户订单号

        //String out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"),"UTF-8");

        //支付宝交易号

        //String trade_no = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"),"UTF-8");

        //交易状态
        String trade_status = new String(request.getParameter("trade_status").getBytes("ISO-8859-1"),"UTF-8");

        //获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(以上仅供参考)//

        if(AlipayNotify.verify(params)){//验证成功
            //////////////////////////////////////////////////////////////////////////////////////////
            //请在这里加上商户的业务逻辑程序代码

            //——请根据您的业务逻辑来编写程序(以下代码仅作参考)——

            if(trade_status.equals("TRADE_FINISHED")){
                //判断该笔订单是否在商户网站中已经做过处理
                //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
                //请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的
                //如果有做过处理,不执行商户的业务程序

                //注意:
                //退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知
            } else if (trade_status.equals("TRADE_SUCCESS")){
                //判断该笔订单是否在商户网站中已经做过处理
                //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
                //请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的
                //如果有做过处理,不执行商户的业务程序

                //注意:
                //付款完成后,支付宝系统发送该交易状态通知

                String total_fee = params.get("total_fee");
                Long userId = Long.valueOf(params.get("out_trade_no").split("O")[0]);
                //updateUserPay(userId, total_fee);
                return "success";
            }
            //——请根据您的业务逻辑来编写程序(以上代码仅作参考)——
            //////////////////////////////////////////////////////////////////////////////////////////
        }else{//验证失败
            System.out.println("+++++++++++++++++++=验证失败");
            return "fail";
        }
        return "fail";
    }

  /*
    private void updateUserPay(Long userId, String total_fee) {
        User user = userService.selectByPrimaryKey(userId);

        if (user != null) {
            user.setPassword(null);
            //余额
            BigDecimal account = user.getAccount() == null ? BigDecimal.valueOf(0.00) : user.getAccount();
            user.setAccount(account.add(BigDecimal.valueOf(Double.valueOf(total_fee))));
            //积分
            //BigDecimal integral = user.getIntegral() == null ? BigDecimal.valueOf(0.00) : user.getIntegral();
            //user.setIntegral(integral.add(BigDecimal.valueOf(Double.valueOf(total_fee))));
            int i = userService.updateByPrimaryKeySelective(user);
            if (i <= 0) {
                log.debug("更新用户出错");
            }

            //充值记录
            MoneyRecord moneyRecord = new MoneyRecord();
            moneyRecord.setTitle("充值");
            moneyRecord.setType(1);
            moneyRecord.setMoneyChange("+" + total_fee);
            moneyRecord.setUserId(userId);

            moneyRecordService.insertJson(moneyRecord);
            log.debug("记录添加成功");
        }
    }
  */

    @RequestMapping
    @RequestDescription("支付宝充值")
    @Transactional(rollbackFor = Throwable.class)
    public JsonResp<?> getAlipayOrderSign(Double money, HttpServletRequest request) throws Exception {
        String sym = request.getRequestURL().toString().split("/api/")[0];
        Long userId = baseController.getUserId();
        String trade_no0 = userId + "O" + UUID.randomUUID().toString().replaceAll("-", "").toLowerCase();
        String trade_no = trade_no0.substring(0,32);
        String stringStringMap = null;
        stringStringMap =  PayUtils.AliPay(
                trade_no,
                money,       //金额
                "纺织达人充值",   //订单名称
                "纺织达人充值",   //订单说明
                sym + alinotify //回调哪个方法
        );
        if (stringStringMap != null) {
            str = stringStringMap.substring(17,stringStringMap.length()-3);
        }

        JsonResp<String> jsonResp = new JsonResp<>();
        if (stringStringMap != null) {
            return jsonResp.data(stringStringMap);
        }else {
            throw new FailException();
        }

    }

}

官方文档: https://doc.open.alipay.com/docs/doc.htm?spm=a219a.7629140.0.0.VbKyV2&treeId=59&articleId=103563&docType=1

参考资料:

技术客服:
https://cschannel.alipay.com/newPortal.htm?scene=mt_zczx&token=&pointId=&enterurl=https%3A%2F%2Fsupport.open.alipay.com%2Falipay%2Fsupport%2Findex.htm

教程
http://blog.csdn.net/xingzizhanlan/article/details/52709899
公钥私钥:
https://doc.open.alipay.com/doc2/detail.htm?spm=a219a.7629140.0.0.nBDxfy&treeId=58&articleId=103242&docType=1
文档:
https://doc.open.alipay.com/docs/doc.htm?spm=a219a.7629140.0.0.rnMrxU&treeId=193&articleId=105465&docType=1

http://www.cnblogs.com/xu-xiang/p/5797643.html

网页支付:
http://www.jb51.net/article/88127.htm

支付宝和微信支付:
简书:http://www.jianshu.com/p/a4f515387264

12.2:
支付宝支付:
http://blog.csdn.net/fengshizty/article/details/53215196

 
时间: 2024-08-23 04:33:12

支付宝(移动支付)服务端java版的相关文章

关于支付宝app支付服务端的实现-Java版

前言 最近在工作中需要使用支付宝app支付,在初次使用过程中也不可避免的出现了一些问题,那么本次随笔主要是概述支付宝app支付服务端的整个实现过程以及就服务端出现的一些问题做一些总结. 1.准备工作 1.1 入驻蚂蚁金服开放平台 https://open.alipay.com/platform/home.htm 1.2 创建应用 首先需要创建一个应用. 然后需要设置应用公钥. 下载支付宝密钥生成器.生成成功之后将公钥复制到这里. 最后提交审核,等待. 2.Maven依赖 首先需要下载SDK,ht

微信app支付(android端+java后台)

本文讲解使用微信支付接口完成在android开发的原生态app中完成微信支付功能, 文章具体讲解了前端android如何集成微信支付功能以及后台如何组装前端需要支付信息, 话不多话, 具体看文章内容吧00:00 / 07:03正常 本实例项目运行条件: 开发环境: [Android Studio] 到微信开放平台注册帐号并且创建移动应用 https://open.weixin.qq.com/cgi-bin/frame?t=home/app_tmpl&lang=zh_CN Column 1 Col

DatagramSocket客户端与服务端Java实例

1 import java.io.IOException; 2 import java.net.DatagramPacket; 3 import java.net.DatagramSocket; 4 import java.net.InetAddress; 5 6 public class TimeClient_UDP{ 7 public static void main(String args[]) throws IOException{ 8 String host = "localhost&

google支付服务端订单验证PHP代码

之前有转发一则关于google支付服务端验证的文章,今天把之前研究出得服务端订单支付验证代码(PHP版本)贴出来大家分享 在进行服务端交易验证之前,需要到google api consle后台https://console.developers.google.com开通google play developer api并获取请求api证书priket.p12文件: 交易状态API官方文档:https://developers.google.com/android-publisher/api-re

支付宝支付与微信支付服务端回调notify_url数据的区别

这两天优化了一下支付宝支付和微信支付订单回调的问题,之前我们的订单都是用手动回调给服务器,现在改成支付宝和微信原生的异步回调,结果并没有像我们想象的那么简单,支付宝是很顺利的解决回调,用一般的方式接收即可,但是微信接收时用普通的接收方式是不行的必须用另一种方式,如下且看: 支付宝和微信的回调地址 notifyUrl = RequestUrl.BASE_URL+"order/order_payment"+"?order_code="+orderCode; 服务器端是P

微信支付服务端开发

前言 最近应公司业务需求,把微信支付完成了,当然已经顺利上线.但是开发的过程是也是踩了很多坑,下面我就先说说开发流程,以及在开发中遇到的大大小小的坑. 开发流程 首先,看一下微信开方平台关于支付的一个时序图,如下: 微信支付时序图https://pay.weixin.qq.com/wiki/doc/api/app/app.php 商户系统和微信支付系统主要交互说明: 步骤1:用户在商户APP中选择商品,提交订单,选择微信支付. 步骤2:商户后台收到用户支付单,调用微信支付统一下单接口.参见[统一

微信APP支付服务端开发Java版(一)

一.准备工作 去微信开发者中心下载(扫码支付,里面的大部分代码是可以用的) https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=11_1 选择UTF-8的版本copy到你的项目里面 找到Configure.java的类修改成public static String PAY_API = "https://api.mch.weixin.qq.com/pay/unifiedorder"; 下面正式进入代码部分 1 //初始化

支付宝移动接口服务端生成签名串代码

1 $ali = array( 2 'service' => 'mobile.securitypay.pay', 3 'partner' => 'xxxxxxxxxx',// 4 '_input_charset' => 'utf-8', 5 'sign_type' => 'RSA', 6 'sign' => '', 7 'notify_url' => urlencode($url),//回调地址 8 'out_trade_no' => $ordernu,//商户网

ali支付服务端对接

引入SDK: <!-- https://mvnrepository.com/artifact/com.aliyun/aliyun-java-sdk-core --><dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-core</artifactId> <version>4.1.1</version></depende