|
|
<?php
|
|
|
|
|
|
class jdpay_plugin
|
|
|
{
|
|
|
static public $info = [
|
|
|
'name' => 'jdpay',
|
|
|
'showname' => '京东支付',
|
|
|
'author' => '京东支付',
|
|
|
'link' => 'https://www.jdpay.com/',
|
|
|
'types' => ['jdpay'],
|
|
|
'inputs' => [
|
|
|
'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);
|
|
|
|
|
|
$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"]);
|
|
|
}
|
|
|
|
|
|
|
|
|
$html_text = '<form action="'.$oriUrl.'" method="post" id="dopay">';
|
|
|
foreach($param as $k => $v) {
|
|
|
$html_text .= "<input type=\"hidden\" name=\"{$k}\" value=\"{$v}\" />\n";
|
|
|
}
|
|
|
$html_text .= '<input type="submit" value="正在跳转"></form><script>document.getElementById("dopay").submit();</script>';
|
|
|
|
|
|
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);
|
|
|
|
|
|
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());
|
|
|
|
|
|
|
|
|
$decryptStr = RSAUtils::decryptByPublicKey($sign);
|
|
|
|
|
|
$sha256SourceSignString = hash ( "sha256", $strSourceData);
|
|
|
|
|
|
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);
|
|
|
|
|
|
|
|
|
$flag=XMLUtil::decryptResXml($return_content,$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;
|
|
|
}
|
|
|
|
|
|
} |