'jdpay', //支付插件英文名称,需和目录名称一致,不能有重复
'showname' => '京东支付', //支付插件显示名称
'author' => '京东支付', //支付插件作者
'link' => 'https://www.jdpay.com/', //支付插件作者链接
'types' => ['jdpay'], //支付插件支持的支付方式,可选的有alipay,qqpay,wxpay,bank
'inputs' => [ //支付插件要求传入的参数以及参数显示名称,可选的有appid,appkey,appsecret,appurl,appmchid
'appid' => [
'name' => '商户号',
'type' => 'input',
'note' => '',
],
'appkey' => [
'name' => '商户DES密钥',
'type' => 'input',
'note' => '',
],
],
'select' => null,
'note' => '需要将商户私钥seller_rsa_private_key.pem上传到 /plugins/jdpay/inc/cert 文件夹内', //支付密钥填写说明
'bindwxmp' => false, //是否支持绑定微信公众号
'bindwxa' => false, //是否支持绑定微信小程序
];
static public function submit(){
global $siteurl, $channel, $order, $ordername, $sitename, $submit2, $conf;
require(PAY_ROOT."inc/common/SignUtil.php");
require(PAY_ROOT."inc/common/TDESUtil.php");
if(checkmobile()==true){
$oriUrl = 'https://h5pay.jd.com/jdpay/saveOrder';
}else{
$oriUrl = 'https://wepay.jd.com/jdpay/saveOrder';
}
$param=array();
$param["version"]='V2.0';
$param["merchant"]=$channel['appid'];
$param["tradeNum"]=TRADE_NO;
$param["tradeName"]=$ordername;
$param["tradeTime"]= date('YmdHis');
$param["amount"]= strval($order['realmoney']*100);
$param["currency"]= 'CNY';
$param["callbackUrl"]= $siteurl.'pay/return/'.TRADE_NO.'/';
$param["notifyUrl"]= $conf['localurl'].'pay/notify/'.TRADE_NO.'/';
$param["ip"]= $clientip;
$param["userId"]= '';
$param["orderType"]= '1';
$unSignKeyList = array("sign");
$desKey = $channel['appkey'];
$sign = SignUtil::signWithoutToHex($param, $unSignKeyList);
//echo $sign."
";
$param["sign"] = $sign;
$keys = base64_decode($desKey);
$param["tradeNum"]=TDESUtil::encrypt2HexStr($keys, $param["tradeNum"]);
if($param["tradeName"] != null && $param["tradeName"]!=""){
$param["tradeName"]=TDESUtil::encrypt2HexStr($keys, $param["tradeName"]);
}
$param["tradeTime"]=TDESUtil::encrypt2HexStr($keys, $param["tradeTime"]);
$param["amount"]=TDESUtil::encrypt2HexStr($keys, $param["amount"]);
$param["currency"]=TDESUtil::encrypt2HexStr($keys, $param["currency"]);
$param["callbackUrl"]=TDESUtil::encrypt2HexStr($keys, $param["callbackUrl"]);
$param["notifyUrl"]=TDESUtil::encrypt2HexStr($keys, $param["notifyUrl"]);
$param["ip"]=TDESUtil::encrypt2HexStr($keys, $param["ip"]);
if($param["userId"] != null && $param["userId"]!=""){
$param["userId"]=TDESUtil::encrypt2HexStr($keys, $param["userId"]);
}
if($param["orderType"] != null && $param["orderType"]!=""){
$param["orderType"]=TDESUtil::encrypt2HexStr($keys, $param["orderType"]);
}
//print_R($param);exit;
$html_text = '
';
return ['type'=>'html','data'=>$html_text];
}
//异步回调
static public function notify(){
global $channel, $order;
require(PAY_ROOT."inc/common/XMLUtil.php");
define("Confid_desKey",$channel['appkey']);
$xml = file_get_contents("php://input");
$flag = XMLUtil::decryptResXml($xml, $param);
//var_dump($flag);
if($flag){
$trade_no = daddslashes($param["tradeNum"]);
$out_trade_no = daddslashes($param["tradeNum"]);
if($param["status"]==2) {
if($out_trade_no == TRADE_NO && $param["amount"]==strval($order['realmoney']*100)){
processNotify($order, $trade_no);
}
}
return ['type'=>'html','data'=>'success'];
}else{
return ['type'=>'html','data'=>'error'];
}
}
//同步回调
static public function return(){
global $channel, $order;
require(PAY_ROOT."inc/common/SignUtil.php");
require(PAY_ROOT."inc/common/TDESUtil.php");
$desKey = $channel['appkey'];
$keys = base64_decode($desKey);
$param = array();
if(!empty($_POST["tradeNum"])){
$param["tradeNum"]=TDESUtil::decrypt4HexStr($keys, $_POST["tradeNum"]);
}
if(!empty($_POST["amount"])){
$param["amount"]=TDESUtil::decrypt4HexStr($keys, $_POST["amount"]);
}
if(!empty($_POST["currency"])){
$param["currency"]=TDESUtil::decrypt4HexStr($keys, $_POST["currency"]);
}
if(!empty($_POST["tradeTime"])){
$param["tradeTime"]=TDESUtil::decrypt4HexStr($keys, $_POST["tradeTime"]);
}
if(!empty($_POST["status"])){
$param["status"]=TDESUtil::decrypt4HexStr($keys, $_POST["status"]);
}
$sign = $_POST["sign"];
$strSourceData = SignUtil::signString($param, array());
//echo "strSourceData=".htmlspecialchars($strSourceData)."
";
//$decryptBASE64Arr = base64_decode($sign);
$decryptStr = RSAUtils::decryptByPublicKey($sign);
//echo "decryptStr=".htmlspecialchars($decryptStr)."
";
$sha256SourceSignString = hash ( "sha256", $strSourceData);
//echo "sha256SourceSignString=".htmlspecialchars($sha256SourceSignString)."
";
if($decryptStr == $sha256SourceSignString){
$trade_no = daddslashes($param["tradeNum"]);
$out_trade_no = daddslashes($param["tradeNum"]);
if($out_trade_no == TRADE_NO && $param["amount"]==$order['realmoney']*100){
processReturn($order, $trade_no);
}else{
return ['type'=>'error','msg'=>'订单信息校验失败'];
}
}else{
return ['type'=>'error','msg'=>'验证签名失败!strSourceData='.htmlspecialchars($strSourceData)];
}
}
//退款
static public function refund($order){
global $channel;
if(empty($order))exit();
require(PAY_ROOT."inc/common/XMLUtil.php");
require(PAY_ROOT."inc/common/HttpUtils.php");
define("Confid_desKey",$channel['appkey']);
$param["version"]="V2.0";
$param["merchant"]=$channel['appid'];
$param["tradeNum"]=$order['trade_no'].rand(000,999);
$param["oTradeNum"]=$order['api_trade_no'];
$param["amount"]=$order['refundmoney']*100;
$param["currency"]="CNY";
$reqXmlStr = XMLUtil::encryptReqXml($param);
$url = 'https://paygate.jd.com/service/refund';
$httputil = new HttpUtils();
list ( $return_code, $return_content ) = $httputil->http_post_data($url, $reqXmlStr);
//echo $return_content."\n";
$flag=XMLUtil::decryptResXml($return_content,$resData);
//echo var_dump($resData);
if($flag){
if($resData['status'] == "1"){
$result = ['code'=>0, 'trade_no'=>$resData['oTradeNum'], 'refund_fee'=>$resData['amount']];
}else{
$result = ['code'=>-1, 'msg'=>'['.$resData['result']['code'].']'.$resData['result']['desc']];
}
}else{
$result = ['code'=>-1, 'msg'=>'验签失败'];
}
return $result;
}
}