zoukankan      html  css  js  c++  java
  • 支付宝支付

    支付宝开发分为生产环境和沙箱环境,沙箱环境是用来做测试用的
    1:使用支付宝沙箱环境,会自动生成APPID,商户UID,支付宝网关为https://openapi.alipaydev.com/gateway.do。项目正式上线时网关为https://openapi.alipay.com/gateway.do
     

    2:需要我们为项目添加应用公钥(由平台提供的秘钥工具生成,一般用RSA2,2048位),支付宝公钥由支付宝提供。主要用来加密和解密。

    2.1:私钥加密,公钥解密,2.2:私钥签名,公钥延签
    2.1.1 加密用公钥,解密用私钥
    2.2.1:接收支付宝返回的数据需通过支付宝公钥进行验签,确认返回数据者身份为支付宝。  
    2.2.2:客户端将商户的签名字符串用私钥签名上传到服务器,服务器端通过开发人员上传的(应用)公钥进行验签,确认身份。
    商户后台需要传入支付宝公钥,对支付宝返回数据进行延签。
    商户后台需要传入应用私钥,对数据进行加密。
    公共平台有支付宝公钥,商户应用公钥。双方都可以获取。
    支付宝后台获取应用公钥对商户数据进行延签和解密。
    同样商户后台获取支付宝公钥,对返回数据进行延签和解密。
    支付宝生成秘钥时,需要在公共平台验签,
     
     3:验证秘钥正确性,下载签名工具对秘钥进行验证
          

    4:将与应用公钥对应的应用私钥,放到验签工具的左方框内,生成右边的签名。 

     
     5:将生成的签名放入到验签框内。
         验证,提示成功,保存
      

    6:为应用添加应用网关和授权回调地址

    应用网关为商户的服务器
    授权回调地址需要公网能访问,商户后台需要对其拦截并验证。是否付款成功等。
    7:网页应用创建成功。
     我们就可以编写商户后台程序,为支付宝准备相应的数据,进行支付。  https://github.com/egzosn/pay-java-parent
     
     8:后台对对接支付宝进行配置
       
    package verticleTest;
    
    import reference.AliPayConfigStorage;
    
    public class AliPayStorageSetting {
    
        AliPayConfigStorage aliPayConfigStorage;
    
        public static AliPayConfigStorage getAliPayConfigStorage() {
            
            String app_id = "2016091200494690";  //appid
         //应用私钥, 加密 String APP_PRIVATE_KEY
    = "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCrjJrvXTZubckZqlOjD/V+VyMmAvDuD++rT6sAjM6X1J3gAXkcOotO8WWTXo/zcFHfbtSZjte0xoTz1RFkobWu0RRXJcM7+khCYbjxo/x0nkoqMQuwviikWKDoyxwbkUYEWmdKVcC7rg5tiyBbFGwIywjfo9ztDE7fklDCcDbhSCBlxrOG9Y8xjq/3V0xtvHSQiw+y/966SH+l1ZvnT/RTVb3tKlkSWEvgOJv/c4xz5yuXimFJp1gVKS118O6NRO7PM86Lvqz4GLb6RJ6wrGdwqwig6QTbCPxC9mmONaUE6WQOjhyuvEejoSh8T3GZSUKaMqO/gmAKJWnBAlpnOKt5AgMBAAECggEBAIpZAZZq0Pvr1BO7tmm59BzovzLnilAjUAETZfAynmX6FTxTU829NR38NhPMXkFQYubTZedVOIbU1uIiAj3q4C/U9Bd4H+Rd6yqFzvYpbu7JvTwbg7cNFI+93j7/lnJxDUtzcPuU/rMdIwua+QQbCyloPIbHiuMtWuqZAEJe5xN0mlEH2kKaOjvHvwaBUAC5w3gy/RswTBKOe4n1XaFXUmzuwWD6ECmHjGbKtooPwjuGPKsLYTINCu047uGjzyA0nd8+1dWDdWiWBDflWQRpYWR1zHINftiedHVSuhrKsprPI3/bJE1DV/0+8MbNY2lfIrh54d9e1OKpO+FqoXmrd/UCgYEA2cDo2Lxw7QvT/zEmv1q6q0LUwPhOo9K7lPNW7kB82uaeAdKrei9BC7hJwMfP4cA0J9wHLzOUMnnlSp90hVZmyefV+RkJdxCmNwnRZIRGo1YVEuCLU1stosKE5CxY9dZQNkkIFL3AFkRku82hVVoEJDm+nCKT9wpKYNir0FYlS6MCgYEAya4pJHwPCS5OsrNilBF5AZ7cJ3TQ9ZuEdZh+prjLcBXmVXG3qBfYGE5Mfxj6TaKdETODVIH9U5S1JN5Adm17GLaKFbE0JdPwn7HJEPwDPO3Fi08GhyujqYAFagSkhAcZj/dj8NrMV2uwd8t7/gnj/6zH7eWhctbbzWQNJ3Q0njMCgYASAVR/j11bDG5UHJFSo0LqJFWJOz7tZuBh2ZknjCeGxijsh6nsKXocaPmYOi1jQkxNu3DQo1gusEuYVwUAfXt0WHol5b8VnEfSJzqsMA/TM6v8apq6osBsQ99PKqeUdEsfofxMEsCOVstpiAA+GXpcMHYlXOqVM8GgrmnOiUD+NwKBgE64wWxxVDkkLynHpWngbBg61vo7ubi0zH5OWNlg9l+43KBrc+GT9RB/t5JAwKr/F0n4joG0/5nZSN+sNQNE9rCNx9ZxxcYiNSFQdwg/JlBpCxu2a/jlCswFoZdhWooCb3LngMYp0WsqKMaJ0cs2Nx28ZomwgVVfEorYS94jmMpLAoGBAM8htyte48bv98JqQzCe453ajwq4XfB+hpDvz2DiiotX7tPmaPGnn1ugOSrfnPs5ZSCOZPEZOuCKofwDd4U/RH/7L60+a8QeBIfOYZf4YzGzfcVevhXmPBqfFHwM1oy1SGYPichx8YgeqkPGQ5CRSpGt62e7+LFV1QWELFK5VMHf";
         String ALIPAY_PUBLIC_KEY
    = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwt9rjnmpGrOQXsYzuNIs24cPgvFKpXRHRrvuKeViBDmsuk/xzhHGG3aFnN+TH2vXlqkzaDtjmohguRHRf1C8r27lPySmgb5SRoHBVSoxkxE5wt8GkItYfvAc2BtcFZtweWrkQaVVHC1smBxmfxhqyURZIObaAVrfzzEMBRiVy5pCugKhJB9YeIQsxnWTa8wwD9IiGWtfZJNKMmu95O0cpx1Vy0HRZEF0uABvhOnZxflqg4c1U9lffEQ/QWKEzFZKyBui/pNE9CR069eYjS4IIii0ZXQUewpCMDJB1xlTYCVl0a73eGnszl58KzFDWDGZkZeGqumvCCGZ3IK11YqXtQIDAQAB"; String notify_url = "http://k19847n443.51mypc.cn:37169/static/index.html"; // 处理完,支付宝会将处理的结果返回到通知页面 String return_url = "http://k19847n443.51mypc.cn:37169/notifyalipay"; // return_url,返回页面,用户支付完,会跳到哪一个页面 String sign_type = "RSA2"; String charset = "utf-8"; String gatewayUrl = "https://openapidev.alipay.com/gateway.do"; //测试环境网关 String log_path = "C:\"; String uid="2088102175307622"; //获取对应的支付账户操作工具(可根据账户id) // PayResponse payResponse = service.getPayResponse(2); AliPayConfigStorage aliPayConfigStorage = new AliPayConfigStorage(); aliPayConfigStorage.setPid(uid); aliPayConfigStorage.setAppId(app_id); aliPayConfigStorage.setKeyPublic(ALIPAY_PUBLIC_KEY); aliPayConfigStorage.setKeyPrivate(APP_PRIVATE_KEY); aliPayConfigStorage.setNotifyUrl(return_url); aliPayConfigStorage.setSignType(sign_type); aliPayConfigStorage.setSeller(uid); aliPayConfigStorage.setInputCharset(charset); //是否为测试账号,沙箱环境 aliPayConfigStorage.setTest(true); return aliPayConfigStorage; } public void setAliPayConfigStorage(AliPayConfigStorage aliPayConfigStorage) { this.aliPayConfigStorage = aliPayConfigStorage; } }

    9:使用vertx开发后台程序。

    
    

    package aliPay;

    
    

    import java.awt.image.BufferedImage;
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.math.BigDecimal;
    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.Map;
    import java.util.Set;
    import java.util.UUID;
    import javax.imageio.ImageIO;

    
    

    import org.apache.logging.log4j.LogManager;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;

    
    

    import com.egzosn.pay.common.api.PayService;
    import com.egzosn.pay.common.bean.MethodType;
    import com.egzosn.pay.common.bean.PayOrder;

    
    

    import aliPay.test.AliPayTestStorageSetting;
    import aliPay.utils.AliPayConfigStorage;
    import aliPay.utils.AliPayService;
    import aliPay.utils.AliTransactionType;
    import io.vertx.core.AbstractVerticle;
    import io.vertx.core.Future;
    import io.vertx.core.MultiMap;
    import io.vertx.core.Vertx;
    import io.vertx.core.buffer.Buffer;
    import io.vertx.core.http.HttpServerRequest;

    
    

    import io.vertx.ext.web.Router;
    import io.vertx.ext.web.handler.BodyHandler;
    import io.vertx.ext.web.handler.StaticHandler;

    
    

    public class AliPayVerticle extends AbstractVerticle { //verticle之间相互通信,所以可以将任务交给消费者。

    // public static void main(String[] args) {
    // Vertx vertx=Vertx.vertx();
    //// vertx.deployVerticle(new AliPayStorageSetting());
    // vertx.deployVerticle(new AliPayVerticle());
    // }

    // AliPayStorageSetting aliPayStorgeSetting=new AliPayStorageSetting();
    AliPayConfigStorage aliPayConfigStorage = AliPayTestStorageSetting.getAliPayConfigStorage();

    public void start() {
    org.apache.logging.log4j.Logger logger1 = LogManager.getLogger(AliPayVerticle.class);
    // Logger logger = LoggerFactory.getLogger(AliPayVerticle.class);

    Router router = Router.router(vertx);
    router.route().handler(BodyHandler.create()); // 对请求体做一些限制

    
    

    /*-----------即时到帐 WAP 网页支付-------------------*/
    router.route("/AliInstanceWebPay").handler(ctx -> {
    //
    // AliPayStorageSetting aliPayStorgeSetting=new AliPayStorageSetting();
    // AliPayConfigStorage aliPayConfigStorage = aliPayStorgeSetting.getAliPayConfigStorage();

    logger1.debug("AliInstanceWebPay即时到帐 WAP 网页支付");

    
    

    HttpServerRequest request = ctx.request();
    // 支付服务
    PayService service = new AliPayService(aliPayConfigStorage);
    // logger1.debug(aliPayConfigStorage.getAppid()+"appid");

    // 支付订单基础信息,new BigDecimal(0.01)价格
    logger1.debug("AliInstanceWebPay创建订单开始");
    PayOrder payOrder = new PayOrder("订单title", "摘要", new BigDecimal(0.01),
    UUID.randomUUID().toString().replace("-", ""));
    /*-----------即时到帐 WAP 网页支付-------------------*/
    payOrder.setTransactionType(AliTransactionType.WAP); // WAP支付
    payOrder.setSpbillCreateIp(request.getHeader("X-Real-IP"));
    /*-----------即时到帐 WAP 网页支付-------------------*/
    // StringBuffer requestURL = request.getRequestURL();
    String requestURL = request.absoluteURI();
    // 设置网页地址
    payOrder.setWapUrl(requestURL.substring(0,
    requestURL.indexOf("/") > 0 ? requestURL.indexOf("/") : requestURL.length()));
    // 设置网页名称
    payOrder.setWapName("在线充值");
    logger1.debug("AliInstanceWebPay 创建订单结束");

    // logger1.debug(payOrder.getBody());
    Map directOrderInfo = service.orderInfo(payOrder);
    // 获取表单提交对应的字符串,将其序列化到页面即可,
    logger1.debug("向阿里发送请求");
    String directHtml = service.buildRequest(directOrderInfo, MethodType.POST);
    /*-----------/即时到帐 WAP 网页支付-------------------*/
    // @RequestMapping(value = "toWxPay.html", produces =
    // "text/html;charset=UTF-8")
    logger1.debug("返回页面");
    ctx.response().setStatusCode(400).putHeader("content-type", "text/html").end(directHtml); // 返回jsonP数据。
    });

    
    

    /*-----------扫码支付-------------------*/
    router.route("/AliSweepPay").handler(ctx -> {

    // AliPayStorageSetting aliPayStorgeSetting=new AliPayStorageSetting();
    // AliPayConfigStorage aliPayConfigStorage = aliPayStorgeSetting.getAliPayConfigStorage();

    logger1.debug("AliSweepPay 扫码支付");

    HttpServerRequest request = ctx.request();
    // 支付服务
    PayService service = new AliPayService(aliPayConfigStorage);
    // 支付订单基础信息,new BigDecimal(0.01)价格
    logger1.debug("AliSweepPay 扫码支付创建订单开始");
    PayOrder payOrder = new PayOrder("订单title", "摘要", new BigDecimal(0.01),
    UUID.randomUUID().toString().replace("-", ""));
    String requestURL = request.absoluteURI();
    // 设置网页地址
    payOrder.setWapUrl(requestURL.substring(0,
    requestURL.indexOf("/") > 0 ? requestURL.indexOf("/") : requestURL.length()));
    // 设置网页名称
    payOrder.setWapName("在线充值");
    /*-----------扫码付-------------------*/
    payOrder.setTransactionType(AliTransactionType.SWEEPPAY);
    logger1.debug("AliSweepPay 扫码支付创建订单结束");
    // 获取扫码付的二维码
    logger1.debug("AliSweepPay 生成扫码二维码");
    BufferedImage image = service.genQrPay(payOrder);
    /*-----------/扫码付-------------------*/
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    try {
    ImageIO.write(image, "JPEG", baos);
    } catch (Exception e) {

    
    

    e.printStackTrace();
    }
    byte[] imageByteDataArray = baos.toByteArray();
    Buffer buffer = Buffer.buffer();
    buffer.appendBytes(imageByteDataArray);
    logger1.debug("AliSweepPay 前台返回二维码");
    ctx.response()
    .setStatusCode(400)
    .putHeader("Pragma", "No-cache")
    .putHeader("Cache-Control", "no-cache")
    .putHeader("Expires", "0")
    .putHeader("content-type", "image/jpeg");
    ctx.response().end(buffer); // 返回图片
    });

    /**
    * alipay回调处理
    */
    router.route("/notifyalipay").handler(ctx->{
    logger1.debug("notifyalipay 回调服务");
    // 支付服务
    PayService service = new AliPayService(aliPayConfigStorage);
    HttpServerRequest request = ctx.request();
    /*-----------回调处理-------------------*/
    Map params=new HashMap();
    // // params = service.getParameter2Map(request.params(),System.in );
    MultiMap params2 = request.params();

    Set<String> names = params2.names();
    Iterator<String> iterator = names.iterator();
    int i=params2.size();
    // logger1.debug("毁掉参数个数"+i);
    while(iterator.hasNext()){ //将MultiMap转化为Map
    String key=iterator.next();
    // logger1.debug("key"+key+"value"+params2.get(key));
    params.put(key, params2.get(key));
    }

    logger1.debug("notifyalipay 回调校验");
    if (service.verify(params)){
    logger1.info("notifyalipay 校验成功");
    return;
    }
    logger1.error("notifyalipay 校验失败");

    
    


    });

    router.route("/html/*").handler(StaticHandler.create("html"));

    
    

    vertx.createHttpServer().requestHandler(router::accept).listen(8080);
    }

    
    

    }

     
     
     
     
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    49. 字母异位词分组
    73. 矩阵置零
    Razor语法问题(foreach里面嵌套if)
    多线程问题
    Get json formatted string from web by sending HttpWebRequest and then deserialize it to get needed data
    How to execute tons of tasks parallelly with TPL method?
    How to sort the dictionary by the value field
    How to customize the console applicaton
    What is the difference for delete/truncate/drop
    How to call C/C++ sytle function from C# solution?
  • 原文地址:https://www.cnblogs.com/liyafei/p/8413017.html
Copyright © 2011-2022 走看看