Thinkphp企业网银支付

jianfly.com 2019-01-31 1508次浏览

1.Vendor中放入如下文件

B2bpay

修改其中的配置文件,将acp_test_sign.pfx证书替换为正式证书acp_prod_sign.pfx

2.php

<?php

namespace Home\Controller;
use \Think\Controller;
class B2bpayController extends PublicController {
    //在类初始化方法中,引入相关类库    
	public function __construct() {
		header ( 'Content-type:text/html;charset=utf-8' );
		vendor('B2bpay.acp_service');
    }
    public function dob2bpay() {
    	$id = $_GET['id'];
		$mid = $_SESSION['member']['id'];
		if(!$mid)
			die('未登录');
		$order = M('Orders')->where(" `id`=$id and `mid` = $mid")->find();
		if(!$order)
			die('系统繁忙');

		$params = array(
			//以下信息非特殊情况不需要改动
			'version' => \com\unionpay\acp\sdk\SDKConfig::getSDKConfig()->version,                 //版本号
			'encoding' => 'utf-8',				  //编码方式
			'txnType' => '01',				      //交易类型
			'txnSubType' => '01',				  //交易子类
			'bizType' => '000202',				  //业务类型
			'frontUrl' =>  \com\unionpay\acp\sdk\SDKConfig::getSDKConfig()->frontUrl,  //前台通知地址
			'backUrl' => \com\unionpay\acp\sdk\SDKConfig::getSDKConfig()->backUrl,	  //后台通知地址
			'signMethod' => \com\unionpay\acp\sdk\SDKConfig::getSDKConfig()->signMethod,	              //签名方法
			'channelType' => '07',	              //渠道类型,07-PC,08-手机
			'accessType' => '0',		          //接入类型
			'currencyCode' => '156',	          //交易币种,境内商户固定156
			//TODO 以下信息需要填写
			'merId' => '898320448160389',		//商户代码,请改自己的测试商户号,此处默认取demo演示页面传递的参数
			'orderId' => 'dswmyw'.$order['id'],	//商户订单号,8-32位数字字母,不能含“-”或“_”,此处默认取demo演示页面传递的参数,可以自行定制规则
			'txnTime' => date('YmdHis'),	//订单发送时间,格式为YYYYMMDDhhmmss,取北京时间,此处默认取demo演示页面传递的参数
			'txnAmt' => $order['money']*100,	//交易金额,单位分,此处默认取demo演示页面传递的参数
			
			// 订单超时时间。
			// 超过此时间后,除网银交易外,其他交易银联系统会拒绝受理,提示超时。 跳转银行网银交易如果超时后交易成功,会自动退款,大约5个工作日金额返还到持卡人账户。
			// 此时间建议取支付时的北京时间加15分钟。
			// 超过超时时间调查询接口应答origRespCode不是A6或者00的就可以判断为失败。
			'payTimeout' => date('YmdHis', strtotime('+15 minutes')), 

			// 请求方保留域,
			// 透传字段,查询、通知、对账文件中均会原样出现,如有需要请启用并修改自己希望透传的数据。
			// 出现部分特殊字符时可能影响解析,请按下面建议的方式填写:
			// 1. 如果能确定内容不会出现&={}[]"'等符号时,可以直接填写数据,建议的方法如下。
			//    'reqReserved' =>'透传信息1|透传信息2|透传信息3',
			// 2. 内容可能出现&={}[]"'符号时:
			// 1) 如果需要对账文件里能显示,可将字符替换成全角&={}【】“‘字符(自己写代码,此处不演示);
			// 2) 如果对账文件没有显示要求,可做一下base64(如下)。
			//    注意控制数据长度,实际传输的数据长度不能超过1024位。
			//    查询、通知等接口解析时使用base64_decode解base64后再对数据做后续解析。
			//    'reqReserved' => base64_encode('任意格式的信息都可以'),
			
			//TODO 其他特殊用法:
			//【直接跳转发卡行网银】
			//(因测试环境所有商户号都默认不允许开通网银支付权限,所以要实现此功能需要使用正式申请的商户号去生产环境测试):
			// 1)联系银联业务运营部门开通商户号的网银前置权限
			// 2)上送issInsCode字段,该字段的值参考《平台接入接口规范-第5部分-附录》(全渠道平台银行名称-简码对照表)
	  		//'issInsCode' => 'ABC',  //发卡机构代码
		);
		\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;
    }
    //前台通知地址,填写后台接收银联前台通知的地址
    public function BackReceive() {
    	if (isset ( $_POST ['signature'] )) {
    		if( \com\unionpay\acp\sdk\AcpService::validate ( $_POST ))
    		{
    			//验签成功
    			if($_POST['respCode'] == '00' || $_POST['respCode'] == 'A6')
		    	{
		    		$orderId = substr($_POST['orderId'],6);//订单号
		    		$settleAmt = $_POST['settleAmt'];//金额,分
		    		$order = M('Orders')->where(" `id`=$orderId ")->find();
		    		if(($order['money']*100) != $settleAmt)
		    		{
		    			die("订单金额错误,请联系管理员处理,您的订单号是".$orderId);
		    		}else {
		    			M('Orders')->where(" `id`=$orderId ")->save(array('state'=>'1'));
		    			$this->redirect(U('Orders/myorder'));
		    		}
		    	}
    		}
		} else {
			echo '签名为空';
		}

    	
    	
    }
    //前台通知地址,填写后台接收银联前台通知的地址
    public function FrontReceive() {
    	if (isset ( $_POST ['signature'] )) {
    		if( \com\unionpay\acp\sdk\AcpService::validate ( $_POST ))
    		{
    			//验签成功
    			if($_POST['respCode'] == '00' || $_POST['respCode'] == 'A6')
		    	{
		    		$orderId = substr($_POST['orderId'],6);//订单号
		    		$settleAmt = $_POST['settleAmt'];//金额,分
		    		$order = M('Orders')->where(" `id`=$orderId ")->find();
		    		if(($order['money']*100) != $settleAmt)
		    		{
		    			die("订单金额错误,请联系管理员处理,您的订单号是".$orderId);
		    		}else {
		    			M('Orders')->where(" `id`=$orderId ")->save(array('state'=>'1'));
		    			$this->redirect(U('Orders/myorder'));
		    		}
		    	}
    		}
		} else {
			echo '签名为空';
		}
    }


}

3.附银联官方demo

PHP-Version-SDK