zoukankan      html  css  js  c++  java
  • 支付宝手机网站支付(基于Java实现支付宝手机网站支付)

    • 支付宝支付核心需要的参数是(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:当设置应用公钥完成后就可以查看支付宝公钥内容。)

        <!-- 支付宝SDK -->
        <dependency>
          <groupId>com.alipay.sdk</groupId>
          <artifactId>alipay-sdk-java</artifactId>
          <version>3.7.4.ALL</version>
        </dependency>
    • 配置支付所需配置文件
    /**
     * 支付宝支付配置文件
     */
    public class AlipayConfig {
        // 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";
    }
    • 业务层预下单
    import com.aone.app.common.ali.pay.AlipayConfig;
    import com.aone.app.service.AliH5PayService;
    
    import javax.servlet.http.HttpServletRequest;
    import java.util.HashMap;
    import java.util.Map;
    import com.alipay.api.AlipayClient;
    import com.alipay.api.DefaultAlipayClient;
    
    import com.alipay.api.request.AlipayTradeWapPayRequest;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.stereotype.Service;
    import org.springframework.util.StringUtils;
    
    @Service
    public class AliH5PayServiceImpl implements AliH5PayService {
    
    
        private static final Logger logger = LoggerFactory.getLogger("AliH5PayServiceImpl");
    
        //H5支付宝支付预下单(预下单)
        public Map<String, String> dounifiedOrder(String type, String out_trade_no, String money, HttpServletRequest request) throws Exception{
            Map<String, String> map=new HashMap<>();
    
            //获得初始化的AlipayClient
            AlipayClient alipayClient = new DefaultAlipayClient(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 = new AlipayTradeWapPayRequest();
            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);
            }
            return map;
        }
    
    }
    • 控制层下单接口以及回调接口
    import com.aone.app.common.wx.XMLUtils;
    import com.aone.app.service.AliH5PayService;
    import io.swagger.annotations.Api;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.util.StringUtils;
    import org.springframework.web.bind.annotation.*;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.BufferedReader;
    import java.util.HashMap;
    import java.util.Map;
    
    @RestController
    @RequestMapping("h5pay")
    @Api("H5支付")
    public class PayH5Controller {
    
        private static final Logger log = LoggerFactory.getLogger("PayH5Controller");
    
        @Autowired
        private AliH5PayService aliH5PayService;
    
        /**
         * H5支付统一下单
         * @param request
         * @return
         * @throws Exception
         */
        @ResponseBody
        @RequestMapping(value = "wxPay")
        public Map<String, String> weixinPay(HttpServletRequest request) throws Exception{
            String  type= request.getParameter("type");
            String  orderNo= request.getParameter("orderNo");
            String  money= request.getParameter("money");
            return aliH5PayService.dounifiedOrder(type,orderNo,money,request);
        }
    
        /**
         * H5微信支付异步结果通知
         * @param request
         * @param response
         * @throws Exception
         */
        @RequestMapping(value = "notify")
        public void weixinPayNotify(HttpServletRequest request, HttpServletResponse response) throws Exception {
            BufferedReader reader = request.getReader();
            String line = "";
            Map map = new HashMap();
            String xml = "<xml><return_code><![CDATA[FAIL]]></xml>";;
            StringBuffer inputString = new StringBuffer();
            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支付,缺少其它东西也可参考其它记录。
  • 相关阅读:
    【Azure 应用服务】由 Azure Functions runtime is unreachable 的错误消息推导出 ASYNC(异步)和 SYNC(同步)混用而引起ThreadPool耗尽问题
    【Azure API 管理】是否可以将Swagger 的API定义导入导Azure API Management中
    【Azure 应用服务】Azure Function 不能被触发
    【Azure 环境】Azure Key Vault (密钥保管库)中所保管的Keys, Secrets,Certificates是否可以实现数据粒度的权限控制呢?
    【Azure 事件中心】为应用程序网关(Application Gateway with WAF) 配置诊断日志,发送到事件中心
    【Azure 事件中心】azure-spring-cloud-stream-binder-eventhubs客户端组件问题, 实践消息非顺序可达
    【Azure API 管理】Azure API Management通过请求中的Path来限定其被访问的频率(如1秒一次)
    【Azure 环境】前端Web通过Azure AD获取Token时发生跨域问题(CORS Error)
    【Azure 应用服务】记一次Azure Spring Cloud 的部署错误 (az spring-cloud app deploy -g dev -s testdemo -n demo -p ./hellospring-0.0.1-SNAPSHOT.jar --->>> Failed to wait for deployment instances to be ready)
    【Azure 应用服务】App Service中抓取 Web Job 的 DUMP 办法
  • 原文地址:https://www.cnblogs.com/LJing21/p/11226818.html
Copyright © 2011-2022 走看看