支付宝手机网站支付(基于Java实现支付宝手机网站支付)

摘要:
支付宝支付核心需要的参数是APPID:创建应用后就有的APPID。获取到的应用私钥就是:PRIVATE_KEY。支付宝公钥ALIPAY_PUBLIC_KEY:当设置应用公钥完成后就可以查看支付宝公钥内容。
  • 支付宝支付核心需要的参数是(APPID,PRIVATE_KEY,ALIPAY_PUBLIC_KEY)
  1. APPID:创建应用后就有的APPID。
  2. PRIVATE_KEY:应用私钥
  3. ALIPAY_PUBLIC_KEY:支付宝公钥
  • 上面的2,3的参数得自己弄到,参考文档:https://docs.open.alipay.com/291/105971/
  • 下载好工具后所需要干的事情:(获取到的应用公钥配置到:蚂蚁金服开放平台中在 “应用信息” - “开发设置” - “加签方式”处点击 “设置应用公钥”。获取到的应用私钥就是:PRIVATE_KEY。支付宝公钥ALIPAY_PUBLIC_KEY:当设置应用公钥完成后就可以查看支付宝公钥内容。)

支付宝手机网站支付(基于Java实现支付宝手机网站支付)第1张

    <!-- 支付宝SDK -->
    <dependency>
      <groupId>com.alipay.sdk</groupId>
      <artifactId>alipay-sdk-java</artifactId>
      <version>3.7.4.ALL</version>
    </dependency>
  • 配置支付所需配置文件
/**
 * 支付宝支付配置文件
 */
public classAlipayConfig {
    //1.商户创建应用后获取的appid
    public static String APPID = "********";
    //2.应用私钥
    public static String PRIVATE_KEY ="*******";
    //3.支付宝公钥
    public static String ALIPAY_PUBLIC_KEY = "******";
    //4.回调接口全路径(支付完成异步通知)
    public static String notify_url = "https://******";
    //5.页面跳转同步通知页面路径(支付完成后跳转的页面) 
    public static String return_url = "https://******";
    //6.请求支付宝的网关地址
    public static String URL = "https://openapi.alipay.com/gateway.do";
    //7.编码
    public static String CHARSET = "UTF-8";
    //8.返回格式
    public static String FORMAT = "json";
    //9.加密类型
    public static String SIGNTYPE = "RSA2";
}
  • 业务层预下单
importcom.aone.app.common.ali.pay.AlipayConfig;
importcom.aone.app.service.AliH5PayService;
importjavax.servlet.http.HttpServletRequest;
importjava.util.HashMap;
importjava.util.Map;
importcom.alipay.api.AlipayClient;
importcom.alipay.api.DefaultAlipayClient;
importcom.alipay.api.request.AlipayTradeWapPayRequest;
importorg.slf4j.Logger;
importorg.slf4j.LoggerFactory;
importorg.springframework.stereotype.Service;
importorg.springframework.util.StringUtils;
@Service
public class AliH5PayServiceImpl implementsAliH5PayService {
    private static final Logger logger = LoggerFactory.getLogger("AliH5PayServiceImpl");
    //H5支付宝支付预下单(预下单)
    public Map<String, String> dounifiedOrder(String type, String out_trade_no, String money, HttpServletRequest request) throwsException{
        Map<String, String> map=new HashMap<>();
        //获得初始化的AlipayClient
        AlipayClient alipayClient = newDefaultAlipayClient(AlipayConfig.URL, AlipayConfig.APPID,
                AlipayConfig.PRIVATE_KEY, AlipayConfig.FORMAT, AlipayConfig.CHARSET, AlipayConfig.ALIPAY_PUBLIC_KEY,
                AlipayConfig.SIGNTYPE);
        //设置请求参数passback_params
        String content = "{"out_trade_no":""+ out_trade_no +"","
                + ""total_amount":""+ "0.01" +"","
                + ""subject":""+ "订单" +"","
                + ""timeout_express":""+ "30m" +"","
                + ""body":""+ "支付宝H5支付" +"","
                + ""passback_params":""+type +"","
                + ""product_code":""+"QUICK_WAP_WAY"+""}";
        AlipayTradeWapPayRequest alipayRequest = newAlipayTradeWapPayRequest();
        alipayRequest.setReturnUrl(AlipayConfig.return_url);
        alipayRequest.setNotifyUrl(AlipayConfig.notify_url);
        alipayRequest.setBizContent(content);
        //请求
        String result =alipayClient.pageExecute(alipayRequest).getBody();
        logger.error("result{}",request.toString());
        if(StringUtils.isEmpty(request)){
            map.put("code","201");
            map.put("msg","请求失败");
            map.put("result",null);
        }else{
            map.put("code","200");
            map.put("msg","请求成功");
            map.put("result",result);
        }
        returnmap;
    }
}
  • 控制层下单接口以及回调接口
importcom.aone.app.common.wx.XMLUtils;
importcom.aone.app.service.AliH5PayService;
importio.swagger.annotations.Api;
importorg.slf4j.Logger;
importorg.slf4j.LoggerFactory;
importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
importjava.io.BufferedReader;
importjava.util.HashMap;
importjava.util.Map;
@RestController
@RequestMapping("h5pay")
@Api("H5支付")
public classPayH5Controller {
    private static final Logger log = LoggerFactory.getLogger("PayH5Controller");
    @Autowired
    privateAliH5PayService aliH5PayService;
    /**
     * H5支付统一下单
     * @paramrequest
     * @return
     * @throwsException
     */
    @ResponseBody
    @RequestMapping(value = "wxPay")
    public Map<String, String> weixinPay(HttpServletRequest request) throwsException{
        String  type= request.getParameter("type");
        String  orderNo= request.getParameter("orderNo");
        String  money= request.getParameter("money");
        returnaliH5PayService.dounifiedOrder(type,orderNo,money,request);
    }
    /**
     * H5微信支付异步结果通知
     * @paramrequest
     * @paramresponse
     * @throwsException
     */
    @RequestMapping(value = "notify")
    public void weixinPayNotify(HttpServletRequest request, HttpServletResponse response) throwsException {
        BufferedReader reader =request.getReader();
        String line = "";
        Map map = newHashMap();
        String xml = "<xml><return_code><![CDATA[FAIL]]></xml>";;
        StringBuffer inputString = newStringBuffer();
        while ((line = reader.readLine()) != null) {
            inputString.append(line);
        }
        request.getReader().close();
        log.error("----接收到的报文---{}",inputString.toString());
        if(inputString.toString().length()>0){
            map =XMLUtils.parseXmlToList(inputString.toString());
        }else{
            log.error("接受微信报文为空");
        }
        log.error("map={}",map);
        if(map!=null && "SUCCESS".equals(map.get("result_code"))){
            //成功的业务。。。
            xml = "<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>";
            String type=map.get("attach").toString();
            String orderNo=map.get("out_trade_no").toString();
            log.error("订单号{}",map.get("out_trade_no"));log.error("其它必须参数{}",map.get("attach"));
            if(StringUtils.isEmpty(type)||StringUtils.isEmpty(orderNo)){
                log.error("当前参数类型异常");
            }else{
                //回调业务逻辑

            }
        }else{
            //失败的业务。。。
}
        //告诉微信端已经确认支付成功
response.getWriter().write(xml);
    }
}            
  • 回调接口中解析微信通知XML的工具类XMLUtils,参考微信H5支付,缺少其它东西也可参考其它记录。

免责声明:文章转载自《支付宝手机网站支付(基于Java实现支付宝手机网站支付)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇SQLite Expert安装与注册toad 快捷键大全下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

DELPHI字符串、数组操作函数(转)

对字符串及数组的操作,是每个程序员必须要掌握的。熟练的使用Delphi的这些函数,在编程时能更加得心应手。   1.Copy   功能说明:该函数用于从字符串中复制指定范围中的字符。该函数有3个参数。第一个参数是数据源(即被复制的字符串),第二个参数是从字符串某一处开始复制,第三个参数是要复制字符串的长度(   即个数)。最后函数返回一个新的字符串(即是我...

C#读取EXCEL文件的三种经典方法

1.方法一:采用OleDB读取EXCEL文件: 把EXCEL文件当做一个数据源来进行数据的读取操作,实例如下: public DataSet ExcelToDS(string Path)  {  string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" +"Data Source="+ Path +";...

clickHouse 常用命令

---客户端链接工具clickhouse-client -m -u root -p root --大小写敏感的CREATE TEMPORARY TABLE IF NOT EXISTS test.member_new_simple2 ENGINE = Memory AS SELECT ID,user_id,member_grade,accum_amount...

20、Windows内核函数(1)Windows驱动开发详解笔记,字符串

1、字符串 1)两种字符串,一种是char型,记录ansi字符集。每个字符一个字节。以0标志结束。在KdPrint中用%s输出。 宽字符型,wchar_t,描述unicode字符集的字符串,每个字符两个字节,以0标志结束。通过L来体现。在KdPrint中用%S输出。 如CHAR *string = "Hello"; WCHAR *string2 = L"...

Java中的ASCII、Unicode和UTF-8字符编码集

原文:@http://kxjhlele.iteye.com/blog/333211 首先讲一下几种字符的编码方式: 1. ASCII码 我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符串。每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态,这被称为一个字节(byte)。也就是说,一个字节一共可以用来表示2...

上手七牛云存储

早就听说过七牛云存储,终于有时间上手实践。 1、第一步,注册七牛账号,由于是测试,首先申请的是个人账号 2、注册成功之后,默认是体验账号,每月只有1G的空间容量及1G的下载流量       3、账号认证,认证成功之后将升级为标准账号,每月有10G的空间容量及20G的下载流量       虽然认证麻烦了些,但看得出来,七牛还是很良心的,这种免费套餐对于一...