Bladeren bron

增加微信WEB支付

stanley-king 6 jaren geleden
bovenliggende
commit
6657e56d8d

+ 28 - 9
helper/openapi/GoodsConvertor.php

@@ -8,13 +8,22 @@
 
 namespace openapi;
 
+//class config
+//{
+//    const CONVERT_FCODE_API = "https://passport.lrlz.com/mobile/index.php";
+//    const APP_ID = 'JYC_CHANNEL';
+//    const APP_KEY = 'aa161e84685b42a6862dfa5552195240';
+//    const RSA_PATH = BASE_ROOT_PATH . '/helper/openapi/keys/jyc_pri.pem';
+//    const FCODE_FIELDS = ['appid','appkey','convert_sn','convert_type','batch_code','commonid','time','mobile','return_url'];
+//}
+
 class config
 {
-    const CONVERT_FCODE_API = "https://passport.lrlz.com/mobile/index.php";
-    const APP_ID = 'JYC_CHANNEL';
-    const APP_KEY = 'aa161e84685b42a6862dfa5552195240';
-    const RSA_PATH = BASE_ROOT_PATH . '/helper/openapi/keys/jyc_pri.pem';
-    const FCODE_FIELDS = ['appid','appkey','convert_sn','convert_type','batch_code','commonid','time','mobile','return_url'];
+    const CONVERT_URL = "https://passport.lrlz.com/mobile/index.php";
+    const APP_ID = 'DHKJ_CHANNEL';
+    const APP_KEY = '13e5b127aed296ef6d490cd7cc4c161e';
+    const RSA_PATH = BASE_ROOT_PATH . '/helper/openapi/keys/dhkj_pri.pem';
+    const FIELDS = ['appid','appkey','convert_sn','convert_type','time','mobile','return_url'];
 }
 
 class GoodsConvertor
@@ -31,12 +40,22 @@ class GoodsConvertor
 
     public function fcode($params)
     {
-        $body = $this->presign_body($params,config::FCODE_FIELDS);
+        $body = $this->presign_body($params,config::FIELDS);
+        $signed = $this->sign($body);
+        $params['signed'] = $signed;
+        $params['act'] = 'convert';
+        $params['op']  = 'fcode';
+        return config::CONVERT_URL . "?" . http_build_query($params);
+    }
+
+    public function user($params)
+    {
+        $body = $this->presign_body($params,config::FIELDS);
         $signed = $this->sign($body);
         $params['signed'] = $signed;
-        $params['act'] = 'fcode';
-        $params['op']  = 'convert';
-        return config::CONVERT_FCODE_API . "?" . http_build_query($params);
+        $params['act'] = 'convert';
+        $params['op']  = 'user';
+        return config::CONVERT_URL . "?" . http_build_query($params);
     }
 
     private function sign($body)

+ 3 - 1
helper/openapi/KeyManager.php

@@ -16,11 +16,13 @@ class KeyManager
     private $mKeys = [];
 
     const JYC_APPID = "JYC_CHANNEL";
+    const DHKJ_APPID = "DHKJ_CHANNEL";
 
     private function __construct()
     {
         $this->mPaths = [];
-        $this->mPaths[self::JYC_APPID] = BASE_ROOT_PATH . '/helper/openapi/keys/jyc_pub.pem';
+        $this->mPaths[self::JYC_APPID]  = BASE_ROOT_PATH . '/helper/openapi/keys/jyc_pub.pem';
+        $this->mPaths[self::DHKJ_APPID] = BASE_ROOT_PATH . '/helper/openapi/keys/dhkj_pub.pem';
     }
 
     static public function instance()

+ 11 - 0
helper/openapi/conver.puml

@@ -0,0 +1,11 @@
+@startuml
+actor Chrome
+
+Chrome -> ClientServer: 提交(手机号码等信息)
+ClientServer -> ClientServer: SignInfo(验证兑换码,\n手机号码准确性,\n并签名)
+ClientServer -> Chrome: Redirect 如果成功则重定向到熊猫美妆服务器
+Chrome -> XMMZServer: autologin(将签名的信息带给xmmz)
+XMMZServer -> Chrome: XMMZ 商城
+XMMZServer --> ClientServer: 导入用户是否成功信息
+
+@enduml

+ 27 - 0
helper/openapi/keys/dhkj_pri.pem

@@ -0,0 +1,27 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIEpAIBAAKCAQEAwOlbRohjDYtSrJ6fOiCjG6pMQaq1eougIjQMS7w8gB2nDEc1
+cz1mnVVMfkMzGDT8onHnrm1tLSW6rCSkgnOjbiV6epU4EOsdfvU4RNB0tq1YttT1
+LDmkpiq5bEOkjEJlzuvfrJX/BeY+tGkIduoXe8KXeg7/IE0MOsa2evtgoWzHJpo9
+V9X+bvoVO6HJa8lRJKIPw7Iq/JNVYXm/kFpe9r5eZ0KimgzHZsrFoccd/fp7dZX2
+glPlRnrr3r81ZgRjMZc1SNEcsdIZ83G8rc+aAO/s4rFC4KwiiMAlepNP898sXY32
+fx9il2AZzgYuk49jUGK2DhExO1guZOwzxSo6rQIDAQABAoIBAB3r0/lzrBFsu60E
+iWPlrgbbeipxROa2A2dqtUGF98hTURapcNPoASOEGHI5EBLAHTNBAZNfa6CmCncq
+081cDExISd/7hw+wuAl6FXku7/tplan+C+0JH82aMNpm/321yr62fSHyvfR3SuCG
+rgZrtqq+euo2q0GiUbRIIAOhO9KtnHqDJM0/IiTTgxu7A8PVtSkN3R7kfAZTQeIn
+ODRAQOcOpy/iqePBTnAsHtHp9h+yMOGYomlNX/Ps27u9+8USTt/n2U77dMdWMdw/
+W2oZU8Z44oe4CvHbzGmADrd7JSrlgxOC6Vdzwt/bsyDb95eTjo/kiFIfQKzvNyrK
+Aj8mSE0CgYEA7ZtPs0DbddCyjuj/kI6DiHMASr3qiHcGAAveEE6rva8AHobIRngt
+mupc8chbFbTaFgnNoxjKTS2WFwSsjf/gdMUi9i041udwJ7o2NO5YUznESd53ofN1
++2JI2mGtdMzvIViG/sEV9nGUBZIACvQMJbwOVoegKYZZF6t58BDScOMCgYEAz9hQ
+k2Xu/UYRIL9tbEt3xnVdaiNUxUfxnNKfBm7tVd7CppDF3lnASvJ6zDexY7BMoXdU
+RpHc+TNxa3CVEkFYChIf2Rb98sM7G1axYHlO/AkcpuemyVmjGBUaIW24/HhXhtNq
+BZwcWloQzsluqyCA8f1SOiKLp7lugJMWA03HSy8CgYEAxCYQt3P1N99faGakg1uC
+7iOxvAHoGVvYkjU5ztCDKoXLXWf68WHIlDihHeA+gT7ZQpQ5NEkEyI23d60eHeN8
+Eimj4QIYCCDrD4DDuxJ/y8TGbAzBSerIHQxYBB/ap69+QVLprmkLjnTYs3iBnIk3
+dfc3BuvTpjQIXGfss+fPMe0CgYEAvU7dNSPm5bFn8FfrJnQmiBBmIUJE99tradc9
+GPL4IPpgeK3sS3Wb+6eXyWIApDfz1C2ICS7aAfClIaLNZG837RRNBcI3U2IW9/Oi
+Y6iaFF2IR00/UK3gKxMtVb1GfE5wClGNg8aI3JKkNHSr5Boa2E5PErxcT0xKJbnS
+lvfEyekCgYB4FgPens8LGXFRvrVJTHU8CCeJmuaGb+ItC7SSwYzWaAVyZwjLu3qz
+Y+8er/q5jWxO8STEZf2sCu0LPR4xJyUEmeM4QZPYRLwTGAmaL/7PaoyznLiscx/v
+eMmnJTqDDyFQRsc1oj2BXa+HDkt10fmVu0EpoLuBAHzAQ/RNcWajCg==
+-----END RSA PRIVATE KEY-----

+ 9 - 0
helper/openapi/keys/dhkj_pub.pem

@@ -0,0 +1,9 @@
+-----BEGIN PUBLIC KEY-----
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwOlbRohjDYtSrJ6fOiCj
+G6pMQaq1eougIjQMS7w8gB2nDEc1cz1mnVVMfkMzGDT8onHnrm1tLSW6rCSkgnOj
+biV6epU4EOsdfvU4RNB0tq1YttT1LDmkpiq5bEOkjEJlzuvfrJX/BeY+tGkIduoX
+e8KXeg7/IE0MOsa2evtgoWzHJpo9V9X+bvoVO6HJa8lRJKIPw7Iq/JNVYXm/kFpe
+9r5eZ0KimgzHZsrFoccd/fp7dZX2glPlRnrr3r81ZgRjMZc1SNEcsdIZ83G8rc+a
+AO/s4rFC4KwiiMAlepNP898sXY32fx9il2AZzgYuk49jUGK2DhExO1guZOwzxSo6
+rQIDAQAB
+-----END PUBLIC KEY-----

+ 71 - 0
helper/pay/webpay.php

@@ -0,0 +1,71 @@
+<?php
+/**
+ * Created by PhpStorm.
+ * User: stanley-king
+ * Date: 2019/1/4
+ * Time: 6:11 PM
+ */
+
+namespace Pay;
+
+define(MINIPAY_PATHEX, BASE_DATA_PATH . '/api/mini_wxpay');
+
+require_once(MINIPAY_PATHEX . '/lib/WxPay.Api.php');
+require_once(MINIPAY_PATHEX . '/lib/WxPay.Config.php');
+require_once(MINIPAY_PATHEX . '/lib/WxPay.Data.php');
+require_once(MINIPAY_PATHEX . '/lib/WxPay.Exception.php');
+require_once(MINIPAY_PATHEX . '/lib/WxPay.Notify.php');
+
+
+class webpay implements IPay
+{
+    const wx_notifyurl  = BASE_SITE_URL . '/mobile/web_wxnotify.php';
+    const wx_orderquery = 'https://api.mch.weixin.qq.com/pay/orderquery';
+
+    private $mOpenId;
+
+    public function __construct($openid)
+    {
+        $this->mOpenId = $openid;
+    }
+
+    public function gen_pay($pay_sn,$fee,$order_sn,$subject)
+    {
+        $input = new \MiniPay\WxPayUnifiedOrder();
+        $input->SetBody($subject); //商品或支付单简要描述
+        $input->SetAttach($pay_sn); //附加数据,在查询API和支付通知中原样返回,该字段主要用于商户携带订单的自定义数据
+        $out_trade_no = $pay_sn . sprintf("%03d",mt_rand(0,999)); //给微信用的每次重新生成的商户订单SN, 避免二次支付, 数额修改导致支付失败
+        $input->SetOut_trade_no($out_trade_no);//商户系统内部的订单号,32个字符内、可包含字母, 其他说明见商户订单号
+
+        $input->SetTotal_fee("{$fee}");//订单总金额,单位为分,详见支付金额
+        $input->SetTime_start(date("YmdHis")); //订单生成时间,格式为yyyyMMddHHmmss,如2009年12月25日9点10分10秒表示为20091225091010。其他详见时间规则
+        $input->SetTime_expire(date("YmdHis", time() + 600));//订单失效时间,格式为yyyyMMddHHmmss,如2009年12月27日9点10分10秒表示为20091227091010。其他详见时间规则
+        $input->SetNotify_url(self::wx_notifyurl);
+        $input->SetTrade_type("MWEB");
+        $input->SetOpenid($this->mOpenId);
+        $order = \MiniPay\WxPayApi::unifiedOrder($input);
+
+        if(!array_key_exists("appid", $order)
+            || !array_key_exists("prepay_id", $order)
+            || $order['prepay_id'] == "")
+        {
+            throw new \MiniPay\WxPayException("参数错误");
+        }
+
+        $jsapi = new \MiniPay\WxPayJsApiPay();
+        $jsapi->SetAppid($order["appid"]);
+        $timeStamp = time();
+        $jsapi->SetTimeStamp("$timeStamp");
+        $jsapi->SetNonceStr(\MiniPay\WxPayApi::getNonceStr());
+        $jsapi->SetPackage("prepay_id=" . $order['prepay_id']);
+        $jsapi->SetSignType("MD5");
+        $jsapi->SetPaySign($jsapi->MakeSign());
+
+        return ["data" => $jsapi->GetValues()];
+    }
+
+    public function on_notify($post)
+    {
+
+    }
+}

+ 13 - 0
helper/pay_helper.php

@@ -25,6 +25,7 @@ require_once(BASE_ROOT_PATH . '/helper/pay/wxpay.php');
 require_once(BASE_ROOT_PATH . '/helper/pay/cmbpay.php');
 require_once(BASE_ROOT_PATH . '/helper/pay/jspay.php');
 require_once(BASE_ROOT_PATH . '/helper/pay/minipay.php');
+require_once(BASE_ROOT_PATH . '/helper/pay/webpay.php');
 
 class pay_helper
 {
@@ -150,6 +151,18 @@ class pay_helper
                 return false;
             }
             else {
+                $pay = new Pay\webpay($openid);
+            }
+        }
+        else if($payment == "webpay")
+        {
+            $openid = session_helper::pub_openid();
+            Log::record("openid = {$openid}",Log::DEBUG);
+            if(empty($openid)) {
+                $err = array('code' => errcode::ErrPayment, 'msg' => '微信未授权,不可以进行网页支付.');
+                return false;
+            }
+            else {
                 $pay = new Pay\jspay($openid);
             }
         }

File diff suppressed because it is too large
+ 0 - 737
mobile/api/payment/wxpay/notify_url.log


File diff suppressed because it is too large
+ 0 - 2979
mobile/api/payment/wxpay/notify_url_bak.log


+ 29 - 0
mobile/control/convert.php

@@ -22,6 +22,35 @@ class convertControl extends mobileControl
         parent::__construct();
     }
 
+    public function userOp()
+    {
+        $fileds = ['appid','appkey','convert_sn','convert_type','time','mobile','return_url'];
+
+        $appid = $_GET['appid'];
+        $convert_sn = $_GET['convert_sn'];
+        $return_url = $_GET['return_url'];
+
+        if($this->check_parmas($_GET,$fileds) === false) {
+            $errmsg = ["title" => "请求参数异常","msg"=> "请不要随意修改参数哦"];
+            goto ErrorHandle;
+        }
+        $convert = new openapi\Convertor($fileds);
+        $fSucc = $convert->verify($_GET);
+        if($fSucc === false) {
+            $errmsg = ["title" => "请求参数异常","msg"=> "请不要随意修改参数哦"];
+            goto ErrorHandle;
+        }
+
+
+
+        ErrorHandle:
+        if($fCallBack) {
+            QueueClient::push('OnGoodsConvert',['appid' => $appid,'convert_sn' => $convert_sn,'return_url' => $return_url,'success' => false]);
+        }
+
+        return self::outsuccess($errmsg,"convert/error");
+    }
+
     public function fcodeOp()
     {
         $fileds = ['appid','appkey','convert_sn','convert_type','batch_code','commonid','time','mobile','return_url'];

+ 96 - 0
mobile/web_wxnotify.php

@@ -0,0 +1,96 @@
+<?php
+/**
+ * Created by PhpStorm.
+ * User: stanley-king
+ * Date: 15/12/10
+ * Time: 下午6:01
+ */
+
+ini_set('date.timezone','Asia/Shanghai');
+error_reporting(E_ERROR);
+
+define(OPEN_WXPAY_PATH, BASE_DATA_PATH.'/api/pub_wxpay');
+
+require_once (OPEN_WXPAY_PATH . '/lib/WxPay.Api.php');
+require_once (OPEN_WXPAY_PATH . '/lib/WxPay.Config.php');
+require_once (OPEN_WXPAY_PATH . '/lib/WxPay.Data.php');
+require_once (OPEN_WXPAY_PATH . '/lib/WxPay.Exception.php');
+require_once (OPEN_WXPAY_PATH . '/lib/WxPay.Notify.php');
+require_once (BASE_DATA_PATH . '/logic/delivery.logic.php');
+require_once (BASE_ROOT_PATH . '/helper/pay_helper.php');
+
+
+//xml格式
+//$content = '<xml><appid><![CDATA[wx24c5645aa986234a]]></appid>
+//<attach><![CDATA[120503418859341217]]></attach>
+//<bank_type><![CDATA[CFT]]></bank_type>
+//<cash_fee><![CDATA[1]]></cash_fee>
+//<fee_type><![CDATA[CNY]]></fee_type>
+//<is_subscribe><![CDATA[N]]></is_subscribe>
+//<mch_id><![CDATA[1279745801]]></mch_id>
+//<nonce_str><![CDATA[smzubtf1eul75d7snt7qzqyh258hwns3]]></nonce_str>
+//<openid><![CDATA[o-E2Rw9BKvBKnHgp41VYdxAHMJqg]]></openid>
+//<out_trade_no><![CDATA[127974580120151214143419]]></out_trade_no>
+//<result_code><![CDATA[SUCCESS]]></result_code>
+//<return_code><![CDATA[SUCCESS]]></return_code>
+//<sign><![CDATA[F43C02BBBB3B5E341D78EE477D67F598]]></sign>
+//<time_end><![CDATA[20151214143425]]></time_end>
+//<total_fee>1</total_fee>
+//<trade_type><![CDATA[APP]]></trade_type>
+//<transaction_id><![CDATA[1002150763201512142078937308]]></transaction_id>
+//</xml>';
+
+fcgi_header("Content-Type: text/html; charset=UTF-8");
+
+try
+{
+    $content = $_SERVER['original_querystring'];
+    Log::record("content = {$content}",Log::DEBUG);
+    $result = WxPayResults::Init($content);
+    $ret_wx = array();
+    $ret_code = $result['result_code'];
+    Log::record("result_code= {$ret_code}",Log::DEBUG);
+    if($ret_code == 'SUCCESS')
+    {
+        $out_trade_no = $result['out_trade_no'];
+        $pay_sn = $result['attach'];
+        $trade_no = $result['transaction_id'];
+        
+        Log::record("out_trade_no={$out_trade_no} and pay_sn={$pay_sn} and trade_no = {$trade_no}",Log::DEBUG);
+
+        $payer = new pay_helper($pay_sn);
+        $cb_info = $payer->update_order($trade_no,'webpay');
+        if($cb_info['state'] == false) {
+            Log::record('wxpay error.',Log::DEBUG);
+        }
+        else
+        {
+            Log::record('wxpay success.',Log::DEBUG);
+            if(is_pushoms()) {
+                $logic_delivery = Logic('delivery');
+                $ret = $logic_delivery->putOrder($pay_sn, $trade_no);
+            }
+            $payer->OnSuccess();
+        }
+
+        $ret_wx['return_code'] = 'SUCCESS';
+        $ret_wx['return_msg'] = 'OK';
+    }
+    else {
+        Log::record('wxpay error 2.',Log::DEBUG);
+        $ret_wx['return_code'] = 'FAIL';
+        $ret_wx['return_msg'] = 'Error.';
+    }
+
+    $retoper = new OpenWxPayResults();
+    $retoper->FromArray($ret_wx);
+    $xml = $retoper->ToXml();
+    Log::record("return to wx= {$xml}",Log::DEBUG);
+
+    echo($xml);
+} catch (OpenWxPayException $e){
+    Log::record($e->getTraceAsString(),Log::ERR);
+    $msg = $e->errorMessage();
+    return false;
+}
+

+ 25 - 0
test/TestOpenAPI.php

@@ -141,4 +141,29 @@ class TestOpenAPI extends PHPUnit_Framework_TestCase
         $ret = $convert->verify($input);
     }
 
+    public function testDHKJConvert()
+    {
+        $x = time();
+        $appkey = md5('DHKJ_CHANNEL');
+
+        $input = ['appid' => 'DHKJ_CHANNEL',
+            'appkey' => '13e5b127aed296ef6d490cd7cc4c161e',
+            'convert_sn' => bonus\make_bonus_sn(),
+            'time' => time(),
+            'convert_type' => "user",
+            'ade' => 1];
+
+        $cli = new openapi\GoodsConvertor();
+        $url = $cli->user($input);
+
+        $fileds = ['appid','appkey','convert_sn','convert_type','time','mobile','return_url'];
+        $convert = new openapi\Convertor($fileds);
+
+        $str = parse_url($url,PHP_URL_QUERY);
+         parse_str($str,$input);
+
+
+        $ret = $convert->verify($input);
+    }
+
 }