diff --git a/Application/Admin/Controller/MiniProgramController.class.php b/Application/Admin/Controller/MiniProgramController.class.php
index 0b5fff869..4215ab962 100644
--- a/Application/Admin/Controller/MiniProgramController.class.php
+++ b/Application/Admin/Controller/MiniProgramController.class.php
@@ -15,15 +15,36 @@ class MiniProgramController extends \Think\Controller
private $appId = 'wxb7264c023beac13c';
public function getOpenId() {
- $code = I('code', '061SLWZv3QfSQW2M9A3w3MTOZj4SLWZ5');
+ $code = I('code', '');
if (!$code) {
return $this->ajaxReturn([
'status' => 0,
'msg' => 'code不能为空',
]);
}
+
$url = "https://api.weixin.qq.com/sns/jscode2session?appid={$this->appId}&secret={$this->secert}&js_code={$code}";
$r = file_get_contents($url);
+ $wxInfo = I('userInfo');
+ $wxUser =json_decode($r, true);
+ $exist = M('mini_program_user', 'tab_')->where([
+ 'openid' => $wxUser['openid']
+ ])->find();
+ if (!$exist) {
+ $wxInfoDeJson = json_decode($wxInfo, true);
+ M('mini_program_user', 'tab_')->add([
+ 'openid' => $wxUser['openid'],
+ 'unionid' => $wxUser['unionid'],
+ 'wx_json' => $wxInfo,
+ 'avatar' => $wxInfoDeJson['avatarUrl'],
+ 'nickname' => $wxInfoDeJson['nickName'],
+ 'city' => $wxInfoDeJson['city'],
+ 'province' => $wxInfoDeJson['province'],
+ 'country' => $wxInfoDeJson['country'],
+ 'create_time' => time()
+ ]);
+ }
+
echo $r;
}
diff --git a/ThinkPHP/Library/Vendor/WeixinPayBtoC/WeixinPayBtoC.php b/ThinkPHP/Library/Vendor/WeixinPayBtoC/WeixinPayBtoC.php
new file mode 100644
index 000000000..74c2d58c9
--- /dev/null
+++ b/ThinkPHP/Library/Vendor/WeixinPayBtoC/WeixinPayBtoC.php
@@ -0,0 +1,462 @@
+appid=$appid;
+ if ($mchid)
+ $this->mchid=$mchid;
+ }
+
+ function trimString($value)
+ {
+ $ret = null;
+ if (null != $value)
+ {
+ $ret = $value;
+ if (strlen($ret) == 0)
+ {
+ $ret = null;
+ }
+ }
+ return $ret;
+ }
+
+ /**
+ * 作用:产生随机字符串,不长于32位
+ */
+ public function createNoncestr( $length = 32 )
+ {
+ $chars = "abcdefghijklmnopqrstuvwxyz0123456789";
+ $str ="";
+ for ( $i = 0; $i < $length; $i++ ) {
+ $str.= substr($chars, mt_rand(0, strlen($chars)-1), 1);
+ }
+ return $str;
+ }
+
+ /**
+ * 作用:格式化参数,签名过程需要使用
+ */
+ function formatBizQueryParaMap($paraMap, $urlencode)
+ {
+ // $buff = "";
+ // ksort($paraMap);
+ // foreach ($paraMap as $k => $v)
+ // {
+ // if($urlencode)
+ // {
+ // $v = urlencode($v);
+ // }
+ // //$buff .= strtolower($k) . "=" . $v . "&";
+ // $buff .= $k . "=" . $v . "&";
+ // }
+ // $reqPar;
+ // if (strlen($buff) > 0)
+ // {
+ // $reqPar = substr($buff, 0, strlen($buff)-1);
+ // }
+ // return $reqPar;
+ $buff = "";
+ foreach ($paraMap as $k => $v)
+ {
+ if($k != "sign" && $v != "" && !is_array($v)){
+ $buff .= $k . "=" . $v . "&";
+ }
+ }
+
+ $buff = trim($buff, "&");
+ return $buff;
+ }
+
+ /**
+ * 作用:生成签名
+ */
+ public function getSign($Obj)
+ {
+ foreach ($Obj as $k => $v)
+ {
+ $Parameters[$k] = $v;
+ }
+ //签名步骤一:按字典序排序参数
+ ksort($Parameters);
+ $String = $this->formatBizQueryParaMap($Parameters, false);
+ //echo '【string1】'.$String.'';
+ //签名步骤二:在string后加入KEY
+ $String = $String."&key=".$this->key;
+ // var_dump($String);
+ //echo "【string2】".$String."";
+ //签名步骤三:MD5加密
+ $String = md5($String);
+ //echo "【string3】 ".$String."";
+ //签名步骤四:所有字符转为大写
+ $result_ = strtoupper($String);
+ //echo "【result】 ".$result_."";
+ return $result_;
+ }
+
+ /**
+ * 作用:array转xml
+ */
+ function arrayToXml($arr)
+ {
+ $xml = "
";
+ echo "错误原因查询";
+ curl_close($ch);
+ return false;
+ }
+ }
+
+ /**
+ * 作用:打印数组
+ */
+ function printErr($wording='',$err='')
+ {
+ print_r('
'); + echo $wording.""; + print_r(''); + } + function wite_text($txt,$name){ + $myfile = fopen($name, "w") or die("Unable to open file!"); + fwrite($myfile, $txt); + fclose($myfile); + } +} + +/** + * 请求型接口的基类 + */ +class Wxpay_client_pub extends Common_util_pub +{ + var $parameters;//请求参数,类型为关联数组 + public $response;//微信返回的响应 + public $result;//返回参数,类型为关联数组 + var $url;//接口链接 + var $curl_timeout;//curl超时时间 + + /** + * 作用:设置请求参数 + */ + function setParameter($parameter, $parameterValue) + { + $this->parameters[$this->trimString($parameter)] = $this->trimString($parameterValue); + } + + /** + * 作用:设置标配的请求参数,生成签名,生成接口参数xml + */ + function createXml() + { + $this->parameters["appid"] = $this->appid;//公众账号ID + $this->parameters["mch_id"] = $this->mchid;//商户号 + $this->parameters["nonce_str"] = $this->createNoncestr();//随机字符串 + $this->parameters["sign"] = $this->getSign($this->parameters);//签名 + return $this->arrayToXml($this->parameters); + } + + /** + * 作用:post请求xml + */ + function postXml($tt='') + { + $xml = $this->createXml(); + $this->response = $this->postXmlCurl($xml,$this->url,'',$this->curl_timeout,$tt); + return $this->response; + } + + /** + * 作用:使用证书post请求xml + */ + function postXmlSSL() + { + $xml = $this->createXml(); + $this->response = $this->postXmlSSLCurl($xml,$this->url,$this->curl_timeout); + return $this->response; + } + + /** + * 作用:获取结果,默认不使用证书 + */ + function getResult($tt='') + { + $this->postXml($tt); + $this->result = $this->xmlToArray($this->response); + return $this->result; + } +} + +/** + * 统一支付接口类 + */ +class WeixinPayBtoC extends Wxpay_client_pub +{ + function __construct($appid='',$mchid='') + { + if ($appid) + $this->appid = $appid; + if ($mchid) + $this->mchid = $mchid; + //设置接口链接 + $this->url = "https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers"; + //设置curl超时时间 + $this->curl_timeout = 30; + } + + /** + * 生成接口参数xml + */ + function createXml() + { + try + { + $this->parameters["appid"] = $this->appid;//公众账号ID + $this->parameters["mch_id"] = $this->mchid;//商户号 + $this->parameters["spbill_create_ip"] = $this->get_real_ip();//$_SERVER['REMOTE_ADDR'];//终端ip + $this->parameters["nonce_str"] = $this->createNoncestr();//随机字符串 + $this->parameters["sign"] = $this->getSign($this->parameters);//签名 + return $this->arrayToXml($this->parameters); + }catch (SDKRuntimeException $e) + { + die($e->errorMessage()); + } + } + + //获取真是ip + public function get_real_ip(){ + $ip=false; + if(!empty($_SERVER['HTTP_CLIENT_IP'])){ + $ip=$_SERVER['HTTP_CLIENT_IP']; + } + if(!empty($_SERVER['HTTP_X_FORWARDED_FOR'])){ + $ips=explode (', ', $_SERVER['HTTP_X_FORWARDED_FOR']); + if($ip){ array_unshift($ips, $ip); $ip=FALSE; } + for ($i=0; $i < count($ips); $i++){ + if(!preg_match ('/^(10│172.16│192.168)./', $ips[$i])){ +// if(!eregi ('^(10│172.16│192.168).', $ips[$i])){ + $ip=$ips[$i]; + break; + } + } + } + return ($ip ? $ip : $_SERVER['REMOTE_ADDR']); + } + + /** + * 获取prepay_id + */ + function getPrepayId() + { + $this->postXml(); + $this->result = $this->xmlToArray($this->response); + $prepay_id = $this->result["prepay_id"]; + return $prepay_id; + } + + public function wxPayBtoC($amount, $openId, $realName, $orderId='', $desc='') { + $totalAmount = (100) * $amount; + + $data=array( + 'mch_appid'=> $this->appid, //商户账号appid + 'mchid'=> $this->mchid,//商户号 + 'nonce_str'=> '9wmwosxrqkbd6jtqv7cpxvsbvrj9icnu',//$this->createNoncestr(),//随机字符串 + 'partner_trade_no'=> '1628583966',//$orderId ? $orderId : date('YmdHis').rand(1000, 9999),//商户订单号 + 'openid'=> $openId,//用户openid + 'check_name'=>'FORCE_CHECK',//校验用户姓名选项, + 're_user_name'=> $realName,//收款用户姓名 + 'amount'=>$totalAmount,//金额 + 'desc'=> $desc ? $desc : '打款',//企业付款描述信息 + 'spbill_create_ip'=> get_client_ip(),//Ip地址 + ); + + //生成签名算法 + $secretKey = $this->secret;///这个就是个API密码。MD5 32位。 + $data = array_filter($data); + ksort($data); + $str = ''; + foreach($data as $k=>$v) { + $str.=$k.'='.$v.'&'; + } + $str = $str . 'key='. $secretKey; + $data['sign'] = strtoupper(md5($str)); + //生成签名算法 + $xml = $this->arraytoxml($data); + + $url='https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers'; //调用接口 + var_dump($data, $xml); + $res = $this->postXmlSSLCurl($xml, $url); + $return = $this->xmltoarray($res); + + var_dump($return); + //返回来的结果是xml,最后转换成数组 + /* + array(9) { + ["return_code"]=> + string(7) "SUCCESS" + ["return_msg"]=> + array(0) { + } + ["mch_appid"]=> + string(18) "wx57676786465544b2a5" + ["mchid"]=> + string(10) "143345612" + ["nonce_str"]=> + string(32) "iw6TtHdOySMAfS81qcnqXojwUMn8l8mY" + ["result_code"]=> + string(7) "SUCCESS" + ["partner_trade_no"]=> + string(18) "201807011410504098" + ["payment_no"]=> + string(28) "1000018301201807019357038738" + ["payment_time"]=> + string(19) "2018-07-01 14:56:35" + } + */ + + + $responseObj = simplexml_load_string($res, 'SimpleXMLElement', LIBXML_NOCDATA); + echo $res= $responseObj->return_code; //SUCCESS 如果返回来SUCCESS,则发生成功,处理自己的逻辑 + + return $res; + } + +} + + + + +?> diff --git a/ThinkPHP/Library/Vendor/WeixinPayBtoC/cacert/apiclient_cert.pem b/ThinkPHP/Library/Vendor/WeixinPayBtoC/cacert/apiclient_cert.pem new file mode 100644 index 000000000..aa3a1dd54 --- /dev/null +++ b/ThinkPHP/Library/Vendor/WeixinPayBtoC/cacert/apiclient_cert.pem @@ -0,0 +1,24 @@ +-----BEGIN CERTIFICATE----- +MIID8zCCAtugAwIBAgIUR8W8eF1gknTlMwRrvUk4QeVj3a4wDQYJKoZIhvcNAQEL +BQAwXjELMAkGA1UEBhMCQ04xEzARBgNVBAoTClRlbnBheS5jb20xHTAbBgNVBAsT +FFRlbnBheS5jb20gQ0EgQ2VudGVyMRswGQYDVQQDExJUZW5wYXkuY29tIFJvb3Qg +Q0EwHhcNMjEwODEwMDYzMTUzWhcNMjYwODA5MDYzMTUzWjCBhDETMBEGA1UEAwwK +MTU4MTk5NTc0MTEbMBkGA1UECgwS5b6u5L+h5ZWG5oi357O757ufMTAwLgYDVQQL +DCfnpo/lu7rph5Hoj6Doj5znvZHnu5znp5HmioDmnInpmZDlhazlj7gxCzAJBgNV +BAYMAkNOMREwDwYDVQQHDAhTaGVuWmhlbjCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAN4Elo5fcCP8RN6QNoXGf8uPsVw8XBoMr2hZ0b8g3pJfenfGWjqQ +loFNArOaMbm8oSqReysSuuVL3jJQoA+L/wNEB+mWYPYWcfr/tkZuSxbtwpUecEV0 +ZkDXCoaat0Zg2A/fE5gofATM+YGulnOGNzAOjGVQvsfOo5jT6hqdf6tNJ69u3bm5 +CCIwD4dM6tT83oy3tvQFill3fIS9o5Qu2i/kZD2YS1iDn6rNnHgOOQKHEfmQwCqy +I1G3fxDp1Sl4hQ+SNgrt298yFJxSP7LdF4VO742QLPzilx1xp6HobE3W61h5+C0q +gGjNuWNtLoH2mIzy40gDWWEAvGno3Q4nUoECAwEAAaOBgTB/MAkGA1UdEwQCMAAw +CwYDVR0PBAQDAgTwMGUGA1UdHwReMFwwWqBYoFaGVGh0dHA6Ly9ldmNhLml0cnVz +LmNvbS5jbi9wdWJsaWMvaXRydXNjcmw/Q0E9MUJENDIyMEU1MERCQzA0QjA2QUQz +OTc1NDk4NDZDMDFDM0U4RUJEMjANBgkqhkiG9w0BAQsFAAOCAQEAWiAx/ucENE0b +xlAbNNfPeKsDjQDa4D42BS1dpMSt2NSEvWW0eBda9PV1A7LpzlbZgc3jmmnjDu4k +5UOXY5cy/mSK+CNSPMI/+TC64z4UHuMSl+q0MWoq+IL+HjkFq1waDoq3dastQOMv +OVpMawT9/lufDqZbwfJVRLsBYLUzHUaW2tSCPp4CO5E1s8MworWfDa2XDLPspfKZ +JfKEEiDCcGugB2C9vhIXgcoPjPsuyJd5IHjRLv385HrEVkBshvscqtV5QqpOWiRR +H8zkSU24v/ayF0UoMzORkPILW7RDL0OGJURpu09VaJrV01Q4WpHiWP6Z2Spkc00E +QZYgJWPqgQ== +-----END CERTIFICATE----- diff --git a/ThinkPHP/Library/Vendor/WeixinPayBtoC/cacert/apiclient_key.pem b/ThinkPHP/Library/Vendor/WeixinPayBtoC/cacert/apiclient_key.pem new file mode 100644 index 000000000..098371135 --- /dev/null +++ b/ThinkPHP/Library/Vendor/WeixinPayBtoC/cacert/apiclient_key.pem @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDeBJaOX3Aj/ETe +kDaFxn/Lj7FcPFwaDK9oWdG/IN6SX3p3xlo6kJaBTQKzmjG5vKEqkXsrErrlS94y +UKAPi/8DRAfplmD2FnH6/7ZGbksW7cKVHnBFdGZA1wqGmrdGYNgP3xOYKHwEzPmB +rpZzhjcwDoxlUL7HzqOY0+oanX+rTSevbt25uQgiMA+HTOrU/N6Mt7b0BYpZd3yE +vaOULtov5GQ9mEtYg5+qzZx4DjkChxH5kMAqsiNRt38Q6dUpeIUPkjYK7dvfMhSc +Uj+y3ReFTu+NkCz84pcdcaeh6GxN1utYefgtKoBozbljbS6B9piM8uNIA1lhALxp +6N0OJ1KBAgMBAAECggEBANJz0O9WYmuKFxJN65D1b3BbXklLYhbDTYaCFcOx+akQ +XnupByCarEAW6ueq01X4C2HZk8Jpt8XhG9ff+0mhb/L9iu6OQI0lC5hcysCKjh1G +9Xr65nu/8amm7fBYOkC5TjYFRIKoZZ77Wcvm3fDWGfww3j6vwpiONR+KSVA/WaTa +8yfQyLrgdYG09m+QSTO4L7qvbwh1bfbxsNJ0zI0HuGKDaLW4YuvjKKmV6nYtae0e +SMt1zmu+LuZriGJfPHvy2zXuPtJdoy6SHxApGI5/y6OB44k6G4mW7VmU2sSATT6P +wahXFWqNTHWlbVBL1IQgSKBxLVQ0oXX7+N6/wXmlkUECgYEA8nS21IHDPZ+uh5m8 +CwcFnKrSPpPu5CSUL+i5IrjQ/EBlZGgY4n0Rzf7Yi9DhkmZA73tqBjjbvKK7wuwl +bJelBSngYbvujdW8Bro2yGlvfK7hcPxPt04irdBBTdFY/EOO9wNEyEwHgFvQ1M1n +W3121FO67XHNIeOQA3G19mLgamkCgYEA6muYvGDc64vHtFclxR86QJ0cP/tbOQGn +mfL3Eb83SjXIQ121RlkX5DRKEeSc36pnTLyawPGZod5xA+zbZB5L6hz7eFY3EwJK +I8fCBAQJG+KXHnbjVVsR0mVMleQlfdEWcx1fB/21Mh+dVrGWKYXVQCWlNIWL0hkQ +DUzF0SG9NFkCgYEA6nFXVPdA3jao4fAS96rLj2lSMTaEmlCQhh8H3f5N/o0aPdO2 +tFLxw3n41IGfjRuZELkKlYenWqkU2+/SZEXiSLLsiDTcAIQ681penL3vEuZbkhA3 +2O0R9XZZnzCeVhfRhyK/ANsbqc+eiBcyKTKRk9B/ARi4nVtZJytuIxgLHnkCgYAm +9MiGDabI8gq2+oCJWJ4qnLFUJKZNO+wpVkoexeMfTv6/yzPTw/yHbPUeMhqrxLqz +8ufYxo2ca8XmPBdddPdyqWxU3Cb83rWJaqngVvdYjfhFFMbEqYS1rSXkBu0AEp4j +dS8UueHBuaVBAfQNZHNC3L6ukr7gpE+ZljeNgIjbyQKBgQCheRcqtv9ksIQIfgAJ +h0C/PSHKAtEeOXBpNOfxQu6ohii/J6/U1HK08skUkGWJbCPk+bmCuv+9m9NTtUxW +zoGGalS0UWERWneHdu8QosGbt0DGA/mky1XB0GuFq8jB4QkPNWx23E8VEwd2Bict +q2sWrkZMQzKZypCIUGpv9OihKA== +-----END PRIVATE KEY-----