精华内容
下载资源
问答
  • 最新银联网关支付产品技术开发包 java net php 包括demo和接入文档
  • 银联在线支付接入总结

    千次阅读 2015-12-02 20:19:08
    最近项目要求做银联在线支付,大致步骤如下: 1. 下载银联在线支付SDK 在银联商家技术服务中心下载,链接 -> https://open.unionpay.com/ajweb/index 其实这就是个开发样例,签名和验签的算法不用改,主要是要...

    最近项目要求做银联在线支付,大致步骤如下:

    1. 下载银联在线支付SDK

    在银联商家技术服务中心下载,链接 -> https://open.unionpay.com/ajweb/index

    其实这就是个开发样例,签名和验签的算法不用改,主要是要修改配置文件acp_sdk.properties,改为自己工程的配置

    2. 根据SDK的样例,编写自己项目的代码

    - 封装好form表单,HTTP POST的方式把参数传给银联

    - 银联测试环境付款成功

    - 返回商户网站的时候触发返回时间(获取银联的返回码:如果成功则修改订单状态、付款状态、结算单状态等;如果失败则提示失败)

    3. 在银联测试环境上联调

    4. 项目商用的时候连银联正式环境

    展开全文
  • TP3.2.3 接入银联支付

    2017-12-08 10:18:00
     项目接入银联支付的过程, 在此记录下,希望能帮助开发盆友平坑。  银联SKD链接:https://open.unionpay.com/ajweb/product/newProDetail?proId=1&cataId=14  首先我们先下载官方提供的SDK ,下载好了解压...

    TP3.2.3 接入银联支付

        项目接入银联支付的过程, 在此记录下,希望能帮助开发盆友平坑。

        银联SKD链接:https://open.unionpay.com/ajweb/product/newProDetail?proId=1&cataId=14

        首先我们先下载官方提供的SDK  ,下载好了解压选择版本 ,里面有PHP  java  .net  这里我们自然是选择PHP版本的,接入前我们先配环境,它要我们PHP

      的版本 在5.3以上,并且需开启环境的curl、openssl功能。

       然后就是它提供的测试证书了,默认在window系统是放在D:/certs ,意思是在你的电脑的D创建一个名为certs 的文件夹,然后将4个证书放进去,测试的名为

      acp_test_enc.cer  acp_test_middle.cer  acp_test_root.cer  acp_test_sign.pfx ,在创建一个名为logs文件夹D:/logs/  放支付生成的日志文件,linux中请

     修改成Linux中的路径。

      如图:

      

        你可以在assets文件夹中找到你要的证书,测试环境官方提供四个证书,生产环境官方提供三个,还个签名证书就是后缀为.pfx 的需要你去你的银联那里申请

      下载对应的你还需要可以需要解签名证书的密码 和商户号 , 这些后面都会提到的。

        在然后我们将名为SDK文件夹中的六个文件放到我们项目放到 ThinkPHP\Library\Vendor\Yunpay 的文件夹中

        

         写逻辑代码前你还得前配置好你的acp_sdk.ini 文件 ,文件里面都写的很清楚,这里就不一一解释了,这里是我的支付代码

        

    //银联充值操作
        public function pay()
        {
            header ( 'Content-type:text/html;charset=utf-8' );
            Vendor('Yunpay.acp_service');
    
            //前台通知地址
            $frontUrl = "http://".I("server.HTTP_HOST")."/Assets/rechargedetail";
            //后台通知地址
            $backUrl = "http://".I("server.HTTP_HOST");
            $params = array(
                //以下信息非特殊情况不需要改动
                'version' => \com\unionpay\acp\sdk\SDKConfig::getSDKConfig()->version,          //版本号
                'encoding' => 'utf-8',                                                              //编码方式
                'txnType' => '01',                                                                  //交易类型
                'txnSubType' => '01',                                                              //交易子类
                'bizType' => '000201',                                                              //业务类型
                'frontUrl' =>  $frontUrl,                                                          //前台通知地址
                'backUrl' =>   $backUrl,                                                          //后台通知地址
                'signMethod' => \com\unionpay\acp\sdk\SDKConfig::getSDKConfig()->signMethod,    //签名方法
                'channelType' => '08',                                                             //渠道类型,07-PC,08-手机
                'accessType' => '0',                                                                //接入类型
                'currencyCode' => '156',    
                 // 超过超时时间调查询接口应答origRespCode不是A6或者00的就可以判断为失败。
                   'payTimeout' => date('YmdHis', strtotime('+15 minutes'))                         //订单发送时间
            );
            $txnAmt = I('post.txnAmt');    //交易金额
            $orderId = I('post.orderId');  //商户订单号
    
            //加入商户参数
            $params['txnAmt'] = $txnAmt*100;
            $params['merId'] = C('Yunpay.merId');    //商户号
            $params['orderId'] = $orderId;
            $params['txnTime'] = date('YmdHis');
    
            //商品描述,可空
            $body = trim(I('post.WIDbody'));
            $ud = session('users.uid');
            $data = array(
                    'uid'=>$ud,                                  //用户id
                    'win_code'=>$orderId,                     //商户订单号
                    'winsubject'=>I('post.WIDsubject'),          //订单名称
                    'wintotal_amount'=>$txnAmt,                //付款金额
                    'winbody'=>I('post.WIDbody'),             //商品描述
                    'state'=>'yl',                              //支付方式
                    'status'=>'0',                              //是否支付
                    'ordertime'=>time()                          //交易时间
                );
            M("pay_record")->add($data); // 保存交易信息
            \com\unionpay\acp\sdk\AcpService::sign ( $params );
            $uri = \com\unionpay\acp\sdk\SDKConfig::getSDKConfig()->frontTransUrl;
            $html_form = \com\unionpay\acp\sdk\AcpService::createAutoFormHtml( $params, $uri );
            echo $html_form;
        
        }

        这里我曾试过删除里面的命名空间用 new的方式去写,这样可以简洁代码,但是后面异步的时候报错,客服说不能删除命名空间,这样会导致方法名重复,所以还是乖乖的用demo

      中提供的方法。

        异步方法--------

        

      1     //银联充值异步
      2     public function xxx()
      3     {    
      4         Vendor('Yunpay.acp_service');
      5         $logger = \com\unionpay\acp\sdk\LogUtil::getLogger();
      6         $logger->LogInfo("receive back notify: " . \com\unionpay\acp\sdk\createLinkString ( $_POST, false, true ));
      7         if (isset ( $_POST ['signature'] )) {
      8                 // echo \com\unionpay\acp\sdk\AcpService::validate ( $_POST ) ? '验签成功' : '验签失败';
      9                 $respCode = I('post.respCode');
     10                 $orderId = I('post.orderId');         // 商户订单号
     11                 $total_amount = I('post.settleAmt'); //订单金额
     12                 $trade_no = I('post.queryId');         // queryId 银联唯一标识一笔交易
     13 
     14                 //判断respCode=00、A6后,对涉及资金类的交易,请再发起查询接口查询,确定交易成功后更新数据库。
     15                 if( $respCode=='00' ){
     16                      $this->unionpay($orderId,$total_amount,$trade_no);
     17                 }else{
     18                      $res = $this->confirmpay($orderId,'1');
     19                         if( $res == 'Successful' ){
     20                             $this->unionpay($orderId,$total_amount,$trade_no);
     21                      } else {
     22                             echo '交易失败';
     23                      }
     24                 }
     25 
     26         } else {
     27             echo '签名为空';
     28         }
     29 
     30 
     31     }
     32 
     33 
     34     //银联充值
     35     public function unionpay($orderId,$total_amount,$trade_no)
     36     {
     37         $per = M("pay_record")->where('win_code='.$orderId)->find(); //查找该订单
     38         if( $per['status']=='1' ){
     39             echo '已充值';
     40             return;
     41         }
     42         $Pay = M("pay");
     43         // 在Pay模型中启动事务
     44         $Pay->startTrans();            
     45         // 进行相关的业务逻辑操作
     46         $res = $Pay->where('uid='.$per['uid'])->setInc('money',$total_amount/100);
     47         //数据组合
     48         $data = array(
     49                 'alipay_number'=>$trade_no,                  //银联唯一标识
     50                 'status'=>'1',                              //交易状态
     51                 'paytime'=>time()                          //交易时间
     52             );
     53         M("pay_record")->where('win_code='.$orderId)->save($data); // 修改交易信息
     54 
     55         if (!empty($res)){
     56           // 提交事务
     57           $Pay->commit();
     58         }else{
     59           // 事务回滚
     60           $Pay->rollback();
     61         }
     62     }
     63 
     64 
     65     //确定是否充值操作
     66     public function confirmpay($orderId,$L)
     67     {
     68         header ( 'Content-type:text/html;charset=utf-8' );
     69          Vendor('Yunpay.acp_service');
     70          $params = array(
     71             //以下信息非特殊情况不需要改动
     72             'version' => \com\unionpay\acp\sdk\SDKConfig::getSDKConfig()->version,          //版本号
     73             'encoding' => 'utf-8',          //编码方式
     74             'signMethod' => \com\unionpay\acp\sdk\SDKConfig::getSDKConfig()->signMethod,          //签名方法
     75             'txnType' => '00',              //交易类型
     76             'txnSubType' => '00',          //交易子类
     77             'bizType' => '000000',          //业务类型
     78             'accessType' => '0',          //接入类型
     79             'channelType' => '07',          //渠道类型
     80         );
     81         if($L == '0'){
     82             $time = M("order_pay")->where('win_code = "'.$orderId.'"')->find()['addtime'];
     83         }else{
     84             $time = M("pay_record")->where('win_code = "'.$orderId.'"')->find()['ordertime'];
     85         }
     86         $params['merId'] = C('Yunpay.merId');       //商户号
     87         $params['orderId'] = $orderId;               //交易的订单号
     88         $params['txnTime'] = date('YmdHis',$time); //订单发送时间
     89 
     90         \com\unionpay\acp\sdk\AcpService::sign ( $params ); // 签名
     91         $url = \com\unionpay\acp\sdk\SDKConfig::getSDKConfig()->singleQueryUrl;
     92 
     93         $result_arr = \com\unionpay\acp\sdk\AcpService::post ( $params, $url);
     94         if(count($result_arr)<=0) { //没收到200应答的情况
     95             return 'No200';
     96         }
     97         if (!\com\unionpay\acp\sdk\AcpService::validate ($result_arr) ){
     98             return "应答报文验签失败";
     99         }
    100         if ($result_arr["respCode"] == "00"){
    101             if ($result_arr["origRespCode"] == "00"){
    102                 //交易成功
    103                 //TODO
    104                 return "Successful";
    105             } else if ($result_arr["origRespCode"] == "03"
    106                     || $result_arr["origRespCode"] == "04"
    107                     || $result_arr["origRespCode"] == "05"){
    108                 //后续需发起交易状态查询交易确定交易状态
    109                 //TODO
    110                 return "交易处理中,请稍微查询";
    111             } else {
    112                 //其他应答码做以失败处理
    113                 //TODO
    114                 return "交易失败:" . $result_arr["origRespMsg"];
    115             }
    116         } else if ($result_arr["respCode"] == "03"
    117                 || $result_arr["respCode"] == "04"
    118                 || $result_arr["respCode"] == "05" ){
    119             //后续需发起交易状态查询交易确定交易状态
    120             //TODO
    121             return "处理超时,请稍微查询";
    122         } else {
    123             //其他应答码做以失败处理
    124             //TODO
    125             return "失败:" . $result_arr["respMsg"];
    126         }
    127 
    128     }

        这里第一个方法xxx 中的respCode等于00 就是支付成功 ,如果没有需要根据你生成的订单号在次查询在结果。这里客服说这种失败不好模拟,就不说了,但是这操作方法还是

      建议写下,以防万一 。

        最后说明下几个参数 queryId  银联唯一标识,需要保存, 还有银联支付是按 '分' 做单位的 所以支付跳转前  假如是1元,你得乘以100,它才可以识别为1元,要不然就是0.01元

      然后异步到你的时候,如果你是元的单位在除于100,如果是分就不用了。

        搞定收工 , 祝大家早日成为大牛

      

        

     

     

        

      

      

      

     

    转载于:https://www.cnblogs.com/liubaoqing/p/8004176.html

    展开全文
  • 银联支付 Android端开发demo,开发文档,详细说明,分分钟搞定银联支付接入
  • Android 接入银联支付

    千次阅读 2018-03-12 15:08:13
    根据 中国银联手机支付控件接入指南 将demo中的.so .jar进行集成需要注意Android studio 中assets文件在main目录下显示编码有问题,直接忽略。4.注意权限设置&lt;?xml version="1.0" encoding="u...

    1.打开银联开放平台 https://open.unionpay.com/ 注册账户

    2.点击“技术集成”01选择手机控件支付开发包(安卓版)

    3.根据 中国银联手机支付控件接入指南 将demo中的.so .jar进行集成

    需要注意Android studio 中assets文件在main目录下

    显示编码有问题,直接忽略。

    4.注意权限设置

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="test.bjucloud.uppaytest">
        <uses-permission android:name="android.permission.INTERNET" />
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
        <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
        <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
        <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    
        <uses-permission android:name="org.simalliance.openmobileapi.SMARTCARD" />
    
        <uses-permission android:name="android.permission.NFC" />
        <uses-feature android:name="android.hardware.nfc.hce"/>
        <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:roundIcon="@mipmap/ic_launcher_round"
            android:supportsRtl="true"
            android:theme="@style/AppTheme">
            <activity android:name=".APKActivity">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
            <activity
                android:name="com.unionpay.uppay.PayActivity"
                android:configChanges="orientation|keyboardHidden|keyboard"
                android:screenOrientation="portrait">
            </activity>
    
            <activity
                android:name="com.unionpay.UPPayWapActivity"
                android:configChanges="orientation|keyboardHidden|fontScale"
                android:screenOrientation="portrait"
                android:windowSoftInputMode="adjustResize" >
            </activity>
        </application>
    
    
    </manifest>

    展开全文
  • 银联支付 IOS端接入demo、开发文档 ,详细介绍,分分钟搞定IOS银联支付接入
  • 由于公司App开发的支付需求,需要后台用Java来完成银联支付接入接口。首先你要先进入银联开发登录地址open.unionpay.com找到手机控件支付模块,完成相应的入网步骤准备工作做完之后银联会对你发放相应的技术文档这里...

    由于公司App开发的支付需求,需要后台用Java来完成银联支付接入接口。

    首先你要先进入银联开发登录地址open.unionpay.com


    找到手机控件支付模块,完成相应的入网步骤

    这里写图片描述


    准备工作做完之后银联会对你发放相应的技术文档

    银联接入的相关文档

    这里由于银联所给的证书信息只有14天,所以要尽快下载,并且只能下载一次。
    这里写图片描述

    下载手机控件Demo就可以开始了,这里面IOS版本的和安卓版本的任意一个都可以,都有我们需要的后台开发样例
    这里写图片描述

    将下载下来的Demo仔细阅读开发联调步骤向导中的
    三、后台开发步骤
    1. 打开后台开发包,找到对应语言\示例代码文件夹,看下readme.txt,按步骤部署、修改配置文件等。
    2. 其中Form_6_2_AppConsume的接口可获取tn,请跟客户端开发确定一下后台和app间传递tn的方式,最简单的方法就是直接在页面打印tn,不过部分语言直接仅打印tn的时候会带换行符,建议手机开发在收到tn的时候trim一下。
    3. 后续参考readme完成。
    (此时已经有了大体思路知道该怎么做了,就是通过下面的类得到 tn 返还给Android或者IOS前台人员,剩下的就是他们根据相应下载的控件来调取银联支付接口的事情了,是不是so easy)

    这里写图片描述

    我们首先先来运行一下Demo,在脑海中首先形成一个流程的概念
    工程运行之后访问http://localhost:8080/ACPSample_AppServer/
    输入钱数,点击消费。

    这里写图片描述

    会返回给我们一个报文,这里面有你的请求信息以及应答信息
    在这里我们可以清楚的看到有个神奇的tn
    这就是他们要的

    这里写图片描述

    找到Demo中的这个类,不得不说银联很是牛逼,方便大家接入直接用servlet来写

    这里写图片描述

    这里需要注意的一点是他在加载servlet容器时注释的SDKConfig加载配置文件的代码

    @Override
        public void init(ServletConfig config) throws ServletException {
            /**
             * 请求银联接入地址,获取证书文件,证书路径等相关参数初始化到SDKConfig类中
             * 在java main 方式运行时必须每次都执行加载
             * 如果是在web应用开发里,这个方法可使用监听的方式写入缓存,无须在这出现
             */
            //这里已经将加载属性文件的方法挪到了web/AutoLoadServlet.java中
            //SDKConfig.getConfig().loadPropertiesFromSrc(); //从classpath加载acp_sdk.properties文件
            super.init();
        }

    由于他在web.xml中配置了autoLoadServlet在项目一起动的时候就运行此servlet,会自动执行被挪到web/AutoLoadServlet.java中的加载配置文件信息,所以在自己使用调用的时候不要忘记加载配置文件相关信息。

    <servlet>
        <servlet-name>autoLoadServlet</servlet-name>
        <servlet-class>web.AutoLoadServlet</servlet-class>
        <load-on-startup>0</load-on-startup>
      </servlet>

    下面就可以进行接入了,首先现将Demo中给的银联接入所需要的工具类导入自己的工程,否则复制下面的代码会报错。
    这里写图片描述

    在你需要接入支付的业务处理层中加入如下代码。通过此段程序就可以将tn返给前台,这里我用的是json格式返回的。大家可以采用别种方式。

    //加载配置文件
    SDKConfig.getConfig().loadPropertiesFromSrc();// 从classpath加载acp_sdk.properties文件
    //银联接入 要传入的参数
    String referenceNumber = orderInfo.getOrder_number();//这里的订单id是根据自己的业务需求需要自行设置的         
     // 一分钱
    String amount = "1";
    
    Map<String, String> contentData = new HashMap<String, String>();
    
    /***银联全渠道系统,产品参数,除了encoding自行选择外其他不需修改***/
    contentData.put("version", DemoBase.version);            //版本号 全渠道默认值
    contentData.put("encoding", DemoBase.encoding);     //字符集编码 可以使用UTF-8,GBK两种方式
    contentData.put("signMethod", SDKConfig.getConfig().getSignMethod()); //签名方法
    contentData.put("txnType", "01");                       //交易类型 01:消费
    contentData.put("txnSubType", "01");                    //交易子类 01:消费
    contentData.put("bizType", "000201");                   //填写000201
    contentData.put("channelType", "08");                   //渠道类型 08手机
    
    /***商户接入参数***/
    contentData.put("merId", "************");           //商户号码,请改成自己申请的商户号或者open上注册得来的777商户号测试
    contentData.put("accessType", "0");                //接入类型,商户接入填0 ,不需修改(0:直连商户, 1: 收单机构 2:平台商户)
    contentData.put("orderId", referenceNumber);       //商户订单号,8-40位数字字母,不能含“-”或“_”,可以自行定制规则    
    contentData.put("txnTime", new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()));  //订单发送时间,取系统时间,格式为YYYYMMDDhhmmss,必须取当前时间,否则会报txnTime无效            
    contentData.put("accType", "01");                       //账号类型 01:银行卡02:存折03:IC卡帐号类型(卡介质)
    contentData.put("txnAmt", amount);                      //交易金额 单位为分,不能带小数点
    contentData.put("currencyCode", "156");                 //境内商户固定 156 人民币
    
                    // 请求方保留域,
                    // 透传字段,查询、通知、对账文件中均会原样出现,如有需要请启用并修改自己希望透传的数据。
                    // 出现部分特殊字符时可能影响解析,请按下面建议的方式填写:
                    // 1. 如果能确定内容不会出现&={}[]"'等符号时,可以直接填写数据,建议的方法如下。
                    //contentData.put("reqReserved", "透传信息1|透传信息2|透传信息3");
                    // 2. 内容可能出现&={}[]"'符号时:
                    // 1) 如果需要对账文件里能显示,可将字符替换成全角&={}【】“‘字符(自己写代码,此处不演示);
                    // 2) 如果对账文件没有显示要求,可做一下base64(如下)。
                    //    注意控制数据长度,实际传输的数据长度不能超过1024位。
                    //    查询、通知等接口解析时使用new String(Base64.decodeBase64(reqReserved), DemoBase.encoding);解base64后再对数据做后续解析。
                    //contentData.put("reqReserved", Base64.encodeBase64String("任意格式的信息都可以".toString().getBytes(DemoBase.encoding)));
    
                    //后台通知地址(需设置为外网能访问 http https均可),支付成功后银联会自动将异步通知报文post到商户上送的该地址,【支付失败的交易银联不会发送后台通知】
                    //后台通知参数详见open.unionpay.com帮助中心 下载  产品接口规范  网关支付产品接口规范 消费交易 商户通知
                    //注意:1.需设置为外网能访问,否则收不到通知    2.http https均可  3.收单后台通知后需要10秒内返回http200或302状态码 
                    //    4.如果银联通知服务器发送通知后10秒内未收到返回状态码或者应答码非http200或302,那么银联会间隔一段时间再次发送。总共发送5次,银联后续间隔1、2、4、5 分钟后会再次通知。
                    //    5.后台通知地址如果上送了带有?的参数,例如:http://abc/web?a=b&c=d 在后台通知处理程序验证签名之前需要编写逻辑将这些字段去掉再验签,否则将会验签失败
                    contentData.put("backUrl", DemoBase.backUrl);
    
                    /**对请求参数进行签名并发送http post请求,接收同步应答报文**/
                    Map<String, String> reqData = AcpService.sign(contentData,DemoBase.encoding);            //报文中certId,signature的值是在signData方法中获取并自动赋值的,只要证书配置正确即可。
                    String requestAppUrl = SDKConfig.getConfig().getAppRequestUrl();                                 //交易请求url从配置文件读取对应属性文件acp_sdk.properties中的 acpsdk.backTransUrl
                    Map<String, String> rspData = AcpService.post(reqData,requestAppUrl,DemoBase.encoding);  //发送请求报文并接受同步应答(默认连接超时时间30秒,读取返回结果超时时间30秒);这里调用signData之后,调用submitUrl之前不能对submitFromData中的键值对做任何修改,如果修改会导致验签不通过
    
                    /**对应答码的处理,请根据您的业务逻辑来编写程序,以下应答码处理逻辑仅供参考------------->**/
                    //应答码规范参考open.unionpay.com帮助中心 下载  产品接口规范  《平台接入接口规范-第5部分-附录》
                    if(!rspData.isEmpty()){
                        if(AcpService.validate(rspData, DemoBase.encoding)){
                            LogUtil.writeLog("验证签名成功");
                            String respCode = rspData.get("respCode") ;
                            if(("00").equals(respCode)){
                                //成功,获取tn号
                                String tn = rspData.get("tn");
                                System.out.println("=================================================================");
                                System.out.println(tn);
                                System.out.println("=================================================================");
                                Map<String,Object> Tn = new HashMap<String,Object>();
                                Tn.put("tn", tn);
                                bean.setContent(Tn);//这里是我自己引入的工具类用来返回json格式数据
                                //根据不同的需求大家可能要给前台返回的格式不同,这里我采用了json
                                //TODO
                            }else{
                                //其他应答码为失败请排查原因或做失败处理
                                //TODO
                            }
                        }else{
                            LogUtil.writeErrorLog("验证签名失败");
                            //TODO 检查验证签名失败的原因
                        }
                    }else{
                        //未返回正确的http状态
                        LogUtil.writeErrorLog("未获取到返回报文或返回http状态码非200");
                    }

    配置文件需要放在工程的src下,如果是maven项目放到src/main/resources下就可以。这里要仔细阅读配置文件了,再将tn返还给前台的时候,同时已经把回调地址同样发给了银联,这里的后台通知地址,填写后台接收银联后台通知的地址,必须外网能访问。
    * * * 这里还需要将配置文件中所需要的证书文件按照指定位置放好,如果你的服务器是linux系统的,配置文件中也给你举好了例子。建议最开始先放测试环境的证书,都调试完毕了再更换正式生产的证书也不迟。

    ##############SDK配置文件(证书方式签名)################
    # 说明:
    # 1. 使用时请删除后缀的“.证书”,并将此文件复制到src文件夹下替换原来的acp_sdk.properties。
    # 2. 具体配置项请根据注释修改。
    #
    ################################################
    
    ##########################入网测试环境交易发送地址(线上测试需要使用生产环境交易请求地址)#############################
    
    ##交易请求地址 
    acpsdk.frontTransUrl=https://gateway.test.95516.com/gateway/api/frontTransReq.do
    acpsdk.backTransUrl=https://gateway.test.95516.com/gateway/api/backTransReq.do
    acpsdk.singleQueryUrl=https://gateway.test.95516.com/gateway/api/queryTrans.do
    acpsdk.batchTransUrl=https://gateway.test.95516.com/gateway/api/batchTrans.do
    acpsdk.fileTransUrl=https://filedownload.test.95516.com/
    acpsdk.appTransUrl=https://gateway.test.95516.com/gateway/api/appTransReq.do
    acpsdk.cardTransUrl=https://gateway.test.95516.com/gateway/api/cardTransReq.do
    
    #以下缴费产品使用,其余产品用不到
    acpsdk.jfFrontTransUrl=https://gateway.test.95516.com/jiaofei/api/frontTransReq.do
    acpsdk.jfBackTransUrl=https://gateway.test.95516.com/jiaofei/api/backTransReq.do
    acpsdk.jfSingleQueryUrl=https://gateway.test.95516.com/jiaofei/api/queryTrans.do
    acpsdk.jfCardTransUrl=https://gateway.test.95516.com/jiaofei/api/cardTransReq.do
    acpsdk.jfAppTransUrl=https://gateway.test.95516.com/jiaofei/api/appTransReq.do
    
    ########################################################################
    
    # 报文版本号,固定5.1.0,请勿改动
    acpsdk.version=5.1.0
    
    # 签名方式,证书方式固定01,请勿改动
    acpsdk.signMethod=01
    
    # 是否验证验签证书的CN,测试环境请设置false,生产环境请设置true。非false的值默认都当true处理。
    acpsdk.ifValidateCNName=false
    
    # 是否验证https证书,测试环境请设置false,生产环境建议优先尝试true,不行再false。非true的值默认都当false处理。
    acpsdk.ifValidateRemoteCert=false
    
    #前台通知地址,填写后台接收银联前台通知的地址
    acpsdk.backUrl=http://222.222.222.222:8080/ACPSample_AppServer/backRcvResponse
    
    #后台通知地址,填写后台接收银联后台通知的地址,必须外网能访问
    acpsdk.frontUrl=http://localhost:8080/ACPSample_AppServer/frontRcvResponse
    
    #########################入网测试环境签名证书配置 ################################
    # 多证书的情况证书路径为代码指定,可不对此块做配置。
    # 签名证书路径,必须使用绝对路径,如果不想使用绝对路径,可以自行实现相对路径获取证书的方法;测试证书所有商户共用开发包中的测试签名证书,生产环境请从cfca下载得到。
    # windows样例:
    acpsdk.signCert.path=D:/certs/acp_test_sign.pfx
    # linux样例(注意:在linux下读取证书需要保证证书有被应用读的权限)(后续其他路径配置也同此条说明)
    #acpsdk.signCert.path=/SERVICE01/usr/ac_frnas/conf/ACPtest/acp700000000000001.pfx
    
    # 签名证书密码,测试环境固定000000,生产环境请修改为从cfca下载的正式证书的密码,正式环境证书密码位数需小于等于6位,否则上传到商户服务网站会失败
    acpsdk.signCert.pwd=000000
    # 签名证书类型,固定不需要修改
    acpsdk.signCert.type=PKCS12
    
    ##########################加密证书配置################################
    # 敏感信息加密证书路径(商户号开通了商户对敏感信息加密的权限,需要对 卡号accNo,pin和phoneNo,cvn2,expired加密(如果这些上送的话),对敏感信息加密使用)
    acpsdk.encryptCert.path=d:/certs/acp_test_enc.cer
    
    ##########################验签证书配置################################
    # 验签中级证书路径(银联提供)
    acpsdk.middleCert.path=D:/certs/acp_test_middle.cer
    # 验签根证书路径(银联提供)
    acpsdk.rootCert.path=D:/certs/acp_test_root.cer

    前台交易支付成功后会找寻到你的回调地址,我们需要写一个回调来接收。
    【注:为了安全验签成功才应该写商户的成功处理逻辑】交易成功,更新商户订单状态

    LogUtil.writeLog("BackRcvResponse接收后台通知开始");
    
            String encoding = req.getParameter(SDKConstants.param_encoding);
            // 获取银联通知服务器发送的后台通知参数
            Map<String, String> reqParam = getAllRequestParam(req);
    
            LogUtil.printRequestLog(reqParam);
    
            Map<String, String> valideData = null;
            if (null != reqParam && !reqParam.isEmpty()) {
                Iterator<Entry<String, String>> it = reqParam.entrySet().iterator();
                valideData = new HashMap<String, String>(reqParam.size());
                while (it.hasNext()) {
                    Entry<String, String> e = it.next();
                    String key = (String) e.getKey();
                    String value = (String) e.getValue();
    
                    valideData.put(key, value);
                }
            }
    
            //重要!验证签名前不要修改reqParam中的键值对的内容,否则会验签不过
            if (!AcpService.validate(valideData, encoding)) {
                LogUtil.writeLog("验证签名结果[失败].");
                //验签失败,需解决验签问题
    
            } else {
                LogUtil.writeLog("验证签名结果[成功].");
                //【注:为了安全验签成功才应该写商户的成功处理逻辑】交易成功,更新商户订单状态
                //这里写回调成功之后的业务处理
                String orderId =valideData.get("orderId"); //获取后台通知的数据,其他字段也可用类似方式获取
                                                          //具体的字段可以从运行Demo请求交易返回的报文中得到
                String respCode = valideData.get("respCode");
                //判断respCode=00、A6后,对涉及资金类的交易,请再发起查询接口查询,确定交易成功后更新数据库。
            }
            LogUtil.writeLog("BackRcvResponse接收后台通知结束");
    /**
         * 获取请求参数中所有的信息
         * 
         * @param request
         * @return
         */
        public static Map<String, String> getAllRequestParam(final HttpServletRequest request) {
            Map<String, String> res = new HashMap<String, String>();
            Enumeration<?> temp = request.getParameterNames();
            if (null != temp) {
                while (temp.hasMoreElements()) {
                    String en = (String) temp.nextElement();
                    String value = request.getParameter(en);
                    res.put(en, value);
                //在报文上送时,如果字段的值为空,则不上送<下面的处理为在获取所有参数数据时,判断若值为空,则删除这个字段>
                    //System.out.println("ServletUtil类247行  temp数据的键=="+en+"     值==="+value);
                    if (null == res.get(en) || "".equals(res.get(en))) {
                        res.remove(en);
                    }
                }
            }
            return res;
        }

    到这里基本上就调起交易,并且回调差不多完事了。剩下的就是测试如果能交易成功就要换成生产环境了。
    生产环境所需要的证书还请仔细观看
    这里写图片描述

    展开全文
  • php实现银联网关/WAP支付接入

    千次阅读 2017-12-05 15:39:02
    银联支付用的还是比较少的,而且开发中也没接触多少,不过因为工作项目用银联支付能降低费率,所以还是接入银联支付。本文支付为银联网关和WAP支付接口。 官方网站SDK&DEMO:...
  • 1.微信支付  所需资料:1- appid 需要登录微信公众号平台获取  2-mch_id 需要登录微信支付的商户平台获取  3 - key 需要登录微信支付... 开发注意事项: 1.微信支付的金额以分为单位。2。首先请求预支付接口,从
  • 中国银联在线支付互联网商户接入接口规范 本人资源中还有 中国银联在线支付业务商户接入技术改造指南 以及 中国银联在线支付asp.net接口开发
  • 最近呢,比较忙,公司在接入银联全渠道支付,博主接手的wap支付,发表一下博主在接入的时候遇到的坑和注意事项,方便大家学习接入,爬坑的路上更顺利一点~ 开发步骤 1.以表单的方式组装要发送给银联全渠道系统的...
  • 银联支付开发

    2016-03-11 14:41:00
    最近在接入各种支付机构,鉴于各种产品业务需求不同,具体开发实现不尽相同,不讨论具体业务实现。银联官方商家技术服务网站提供了很多可接入产品,本文仅讨论以下几种收款产品: 网关支付(和手机网页支付(WAP支付...
  • php接入银联支付(更新中)

    千次阅读 2018-11-24 17:04:38
    银联支付开放平台下的SDk,在里面的PHP Version SDK基础上进行接入,版本是5.1. 0,里面还有个指引视频(听声音是个萌妹子?一定的,错不了) 用银联测试账号测试通过,未用正式商户账号试过 链接:...
  • 银联支付后台开发包,demo、开发文档,流程介绍,轻松搞定web端银联接入
  • 银联支付接口常见错误总结

    万次阅读 2012-09-30 10:10:08
    银联支付接口常见错误总结 作者Attilax , 1466519819@qq.com   常见接入问题及解答 1) 开发过程中,报157错误。 答:看下GATEID是不是写了0001,如果是的话,把0001删掉。   2) 网上支付后,点提交时,...
  • 一、wap站①、支付宝接入 1、开发前准备:申请一个通过实名认证的企业支付宝账号,并申请开通手机WAP支付功能。 2、流程 参数准备:企业支付宝账号的PID(...
  • Android开发中的第三方支付SDK的接入与使用(支付宝+微信支付+银联)
  • ①、支付宝接入  1、开发前准备:申请一个通过实名认证的企业支付宝账号,并申请开通手机WAP支付功能。  2、流程  参数准备: 企业支付宝账号的PID(也叫ParnerID)和KEY,如果使用RSA签名而不是MD5的话,...
  • 笔者因为项目需要,接入了第三方支付平台,从最开始的银联,到最后的微信,其中出现了各种BUG问题,到最后的顺利接入,完成支付。现在写一篇简单的博客,记录一下,方便自己日后查阅,也给后面接入的程序猿们一个...
  • 银联支付接入流程 第一步:申请入网 入网即签约,分银联官网注册和服务商注册两种; 入网分以下10步: 前期准备(网站、app、Wap页) 注册登录 选择产品(PC、手机、二维码等) 选择收单机构 上传入网资料 银联/...
  • 成为商户后银联会发邮件到你的邮箱,内容有插件、企业门户控台证书申请、logo、cp.cer、商户接入手册,和商户号ID。 企业门户控台证书申请和商户接入手册都是需要认真看下的,之前没看这个,走了弯路。这个时候你...
  • 银联支付

    2017-04-09 23:05:00
    银联支付(1)银联支付流程图 (2)到银联开发者平台下载开发包 (3)安装“UPPayDemo.apk”,安装后运行效果如下: (4)打开“中国银联手机支付控件接入指南Android.doc”,在这个文档中有测试账号(账号:...

空空如也

空空如也

1 2 3 4 5 6
收藏数 120
精华内容 48
关键字:

银联支付接入开发