1.配置环境
ip域名申请
ip域名审核
ip域名填写
安全中心
商户公钥维护
2.编写代码
*注意,一定要验签
*注意,一定要验签
文章中有的地方没有验签,但是自己根据需要一定要加上(安全第一)
<?php
namespace Service\Controller;
use Base\Webbase;
/**
*汉字转变为utf8编码
*/
function chinesetoutf8($a=null){
$a = iconv("gb2312","utf-8",$a);
return $a;
}
/*
* 验证 webhooks 签名方法
*/
function verify_signature($raw_data, $signature, $pub_key_path) {
$pub_key_contents = file_get_contents($pub_key_path);
// php 5.4.8 以上,第四个参数可用常量 OPENSSL_ALGO_SHA256
return openssl_verify($raw_data, base64_decode($signature), $pub_key_contents, 'sha256');
}
class PayController extends Webbase {
public function _initialize()
{
parent::_initialize();
Vendor('Llpay.lib.llpay_core');
Vendor('Llpay.lib.llpay_md5');
Vendor('Llpay.lib.llpay_rsa');
Vendor('Llpay.lib.llpay_cls_json');
Vendor('Llpay.lib.llpay_notify');
Vendor('Llpay.lib.llpay_submit');
Vendor('Llpay.lib.tixian.llpay_security');
Vendor('Llpay.lib.tixian.llpay_apipost_submit');
}
public function dollpay($data)
{
//商户用户唯一编号
$user_id = $data['uid'];
$bank = M('bankcard')->where(array('uid'=>$this->uid))->find();
$userinfo = M('user_info')->where(array('uid'=>$this->uid))->find();
//支付类型 虚拟商品:101001 实物商品:109001 账户充值:108001
//$busi_partner = $data['busi_partner'];
$busi_partner = 101001;
//商户订单号
$no_order = $data['order_id']; //商户网站订单系统中唯一订单号,必填
//付款金额
$money_order = $data['amount']/100;
//商品名称
$name_goods = $data['name_goods'];
//订单描述
$info_order = $data['info_order'];
/**********************************************/
//卡号
$card_no = $bank['card_number'];
//姓名
$acct_name = $userinfo['name'];
//身份证号
$id_no = $userinfo['idcard'];
//协议号
$no_agree = $data['no_agree'];
/*************************************************/
//风险控制参数
// $risk_item = $data['risk_item'];
// $risk_item = '{\"user_info_bind_phone\":\"17358695911\",\"user_info_dt_register\":\"2013100122130\",\"risk_state\":\"1\",\"frms_ware_category\":\"1019\"}';
$user = M('user')->where(array('uid'=>$user_id))->find();
$userinfo = M('user_info')->where(array('uid'=>$user_id))->find();
$risk_item = '{\"frms_ware_category\":\"1018\",\"user_info_mercht_userno\":\"2018109002237008\",\"user_info_bind_phone\":\"'.$user['mobile'].'\",\"user_info_dt_register\":\"'.date('YmdHis', $user['reg_time']).'\",\"user_info_full_name\":\"'.$userinfo['name'].'\",\"user_info_id_no\":\"'.$userinfo['idcard'].'\",\"user_info_identify_state\":\"1\",\"user_info_identify_type\":\"3\",}';
//订单有效期 分钟为单位,默认为10080分钟(7天)
$valid_order = 10080;
//服务器异步通知页面路径
$notify_url = "http://www.***.com/index.php/**/**/notifyurl";
//需http://格式的完整路径,不能加?id=123这类自定义参数
//页面跳转同步通知页面路径
$return_url = "http://www.***.com/index.php/**/**/returnurl";
//需http://格式的完整路径,不能加?id=123这类自定义参数,不能写成http://localhost/
/************************************************************/
//构造要请求的参数数组,无需改动
$parameter = array (
"oid_partner" => C('llpay_config.oid_partner'),
"app_request" => C('llpay_config.app_request'),
"sign_type" => C('llpay_config.sign_type'),
"valid_order" => C('llpay_config.valid_order'),
"user_id" => $user_id,
"busi_partner" => $busi_partner,
"no_order" => $no_order,
"dt_order" => local_date('YmdHis', time()),
//"dt_order" =>time(),
"name_goods" => $name_goods,
"info_order" => $info_order,
"money_order" => $money_order,
"notify_url" => $notify_url,
"url_return" => $return_url,
"card_no" => $card_no,
"acct_name" => $acct_name,
"id_no" => $id_no,
"no_agree" => $no_agree,
"risk_item" => $risk_item,
"valid_order" => $valid_order
);
$llpay_config = C('llpay_config');
//建立请求
$llpaySubmit = new \LLpaySubmit($llpay_config);
$html_text = $llpaySubmit->buildRequestForm($parameter, "post", "确认");
echo $html_text;
}
/******************************
服务器异步通知页面方法
其实这里就是将notify_url.php文件中的代码复制过来进行处理
*******************************/
public function notifyurl()
{
$llpay_config = C('llpay_config');
//计算得出通知验证结果
$llpayNotify = new \LLpayNotify($llpay_config);
$llpayNotify->verifyNotify();
if ($llpayNotify->result) { //验证成功
//获取连连支付的通知返回参数,可参考技术文档中服务器异步通知参数列表
$no_order = $llpayNotify->notifyResp['no_order'];//商户订单号
$oid_paybill = $llpayNotify->notifyResp['oid_paybill'];//连连支付单号
$result_pay = $llpayNotify->notifyResp['result_pay'];//支付结果,SUCCESS:为支付成功
$money_order = $llpayNotify->notifyResp['money_order'];// 支付金额
if($result_pay == "SUCCESS"){
//请在这里加上商户的业务逻辑程序代(更新订单状态、入账业务)
//——请根据您的业务逻辑来编写程序——
if($result_pay == "SUCCESS"){
//请在这里加上商户的业务逻辑程序代(更新订单状态、入账业务)
//——请根据您的业务逻辑来编写程序——
//payAfter($llpayNotify->notifyResp);
}
//payAfter($llpayNotify->notifyResp);
}
file_put_contents("log.txt", "异步通知 验证成功\n", FILE_APPEND);
die("{'ret_code':'0000','ret_msg':'交易成功'}"); //请不要修改或删除
/
} else {
file_put_contents("log.txt", "异步通知 验证失败\n", FILE_APPEND);
//验证失败
die("{'ret_code':'9999','ret_msg':'验签失败'}");
//调试用,写文本函数记录程序运行情况是否正常
//logResult("这里写入想要调试的代码变量值,或其他运行的结果记录");
file_put_contents("log.txt", "异步通知 验证失败1\n", FILE_APPEND);
}
}
/*
页面跳转处理方法;
这里其实就是将return_url.php这个文件中的代码复制过来,进行处理;
*/
public function returnurl()
{
$llpay_config = C('llpay_config');
//计算得出通知验证结果
$llpayNotify = new \LLpayNotify($llpay_config);
$verify_result = $llpayNotify->verifyReturn();
if($verify_result) {//验证成功
/
//请在这里加上商户的业务逻辑程序代码
//——请根据您的业务逻辑来编写程序(以下代码仅作参考)——
//获取连连支付的通知返回参数,可参考技术文档中页面跳转同步通知参数列表
$json = new \JSON;
$res_data = $_POST["res_data"];
//商户编号
$oid_partner = $json->decode($res_data)-> {'oid_partner' };
//商户订单号
$no_order = $json->decode($res_data)-> {'no_order' };
//支付结果
$result_pay = $json->decode($res_data)-> {'result_pay' };
if($result_pay == 'SUCCESS') {
header("location:http://www.yixianglife.com/yxlife_new/wx_web/index.html#/my") ;
//判断该笔订单是否在商户网站中已经做过处理
//如果没有做过处理,根据订单号(no_order)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
//如果有做过处理,不执行商户的业务程序
}
else {
echo "result_pay=".$result_pay;
}
echo "验证成功<br />";
//——请根据您的业务逻辑来编写程序(以上代码仅作参考)——
/
}
else {
//验证失败
//如要调试,请看llpay_notify.php页面的verifyReturn函数
echo "验证失败";
}
header("location:http://www.**.com") ;
}
/**
* 付款接口
* @param $data
*/
public function payment($data)
{
//商户付款流水号
$no_order = $data['orderid'];
//商户时间
$dt_order = date("YmdHis",time());
//金额
$money_order = $data['amount']/100;
//收款人姓名
$acct_name= $data['acct_name'];
//银行账号
$card_no = $data['card_number'];
//订单描述
$info_order = $data['info'];
//对私标记
$flag_card = '0';
//服务器异步通知地址
$notify_url = 'http://www.**.com/index.php/**/**/tx_notifyurl';
//平台来源
$platform = '**.com';
//版本号
$api_version = '1.0';
//实时付款交易接口地址
$llpay_payment_url = 'https://instantpay.lianlianpay.com/paymentapi/payment.htm';
//需http://格式的完整路径,不能加?id=123这类自定义参数
/************************************************************/
$llpay_config = C('llpay_tx_config');
//构造要请求的参数数组,无需改动
$parameter = array (
"oid_partner" => trim($llpay_config['oid_partner']),
"sign_type" => trim($llpay_config['sign_type']),
"no_order" => $no_order,
"dt_order" => $dt_order,
"money_order" => $money_order,
"acct_name" => $acct_name,
"card_no" => $card_no,
"info_order" => $info_order,
"flag_card" => $flag_card,
"notify_url" => $notify_url,
"platform" => $platform,
"api_version" => $api_version
);
//建立请求
$llpaySubmit = new \LLpaytxSubmit($llpay_config);
//对参数排序加签名
$sortPara = $llpaySubmit->buildRequestPara($parameter);
//传json字符串
$json = json_encode($sortPara);
$parameterRequest = array (
"oid_partner" => trim($llpay_config['oid_partner']),
"pay_load" => ll_encrypt($json,$llpay_config['LIANLIAN_PUBLICK_KEY']) //请求参数加密
);
$html_text = $llpaySubmit->buildRequestJSON($parameterRequest,$llpay_payment_url);
//调用付款申请接口,同步返回0000,是指创建连连支付单成功,订单处于付款处理中状态,最终的付款状态由异步通知告知
//出现1002,2005,4006,4007,4009,9999这6个返回码时或者没返回码,
//抛exception(或者对除了0000之后的code都查询一遍查询接口)调用付款结果查询接口,明确订单状态,不能私自设置订单为失败状态,以免造成这笔订单在连连付款成功了,
//而商户设置为失败,用户重新发起付款请求,造成重复付款,商户资金损失
//对连连响应报文内容需要用连连公钥验签
$arr = json_decode($html_text,true);
return $arr;
/*********************************************************************************/
/*if ($res['ret_code'] =="0000"){
$this->websuccess(self::OUTPUT_SUCCESS,'提现成功');
}else{
file_put_contents("./tx.log",json_encode($res));
$this->weberror(self::THIS_ACTION_ERROR,'提现失败'.$res['ret_msg']);
}
/*********************************************************************************/
}
/**
* 付款结果查询
* @param $data
*/
public function queryPayment($data)
{
$data = $_POST;
$url ="https://instantpay.lianlianpay.com/paymentapi/queryPayment.htm";
$parameterRequest = array (
'oid_partner' =>$data['oid_partner'],
'sign'=>$data['sign'],
'sign_type'=>$data['sign_type'],
'no_order'=>$data['no_order'],
'api_version'=>'1.0'
);
$result = getHttpResponseJSON($url,$parameterRequest);
//$result = json_decode($result);
var_dump($result);
if ($result['result_pay'] =='success')
{
return true;
}else{
return false;
}
}
}