PHP(TP 5)ウィーチャットウィジェット支払い(jsapi)(直接コピー)
ここではAPI論理インタフェース
次は支払いのクラスです/extend/wxpayディレクトリに入れます(自分で作成します)
namespace app\api\controller;
use app\common\controller\Api;
use \think\Request;
use think\Db;
use wxpay\WeixinPay;
/*
*
*/
class Pay extends Api
{
public function pay()
{
$openid = $_POST['openid']; //opendi !!!
$orderid = $_POST['orderid']; // id
//
$orderdata = db('order')->where('id',$orderid)->field('order,money')->find();
//
$wxBizDataCrypt = EXTEND_PATH.'/wxpay/WeixinPay.php';
require_once $wxBizDataCrypt;
$a = new WeixinPay($openid,$orderdata['order'],' ',$orderdata['money']);
$pay = $a -> pay();//
return info(10000,' ',$pay);
}
//
public function notify_url()
{
$path = file_get_contents("php://input");// xml ( )
$time = date('Ymd');
$data = json_decode(json_encode(simplexml_load_string($path, 'SimpleXMLElement', LIBXML_NOCDATA)), true); // xml json json
//
if(strtolower($data['result_code']) == 'success' && strtolower($data['return_code']) == 'success'){
Db::startTrans();
try{
//
Db::commit();
//
} catch (\Exception $e){
Db::rollback();
//
}
} else{
return info(10004,' ');
}
}
}
次は支払いのクラスです/extend/wxpayディレクトリに入れます(自分で作成します)
namespace wxpay; // API
/*
*
*/
class WeixinPay {
protected $appid;
protected $mch_id;
protected $key;
protected $openid;
protected $out_trade_no;
protected $body;
protected $total_fee;
function __construct($openid,$out_trade_no,$body,$total_fee) {
$this->appid = '';// appid
$this->openid = $openid; // openid
//
$this->mch_id = ''; //
//
$this->key = ''; // ,
//
$this->out_trade_no = $out_trade_no; //
//
$this->body = $body; //
//
$this->total_fee = floatval($total_fee)*100;// 100
}
public function pay() {
//
$return = $this->weixinapp();
return $return;
}
//
private function unifiedorder() {
$url = 'https://api.mch.weixin.qq.com/pay/unifiedorder'; // ( )
$parameters = array(
'appid' => $this->appid, // ID
'mch_id' => $this->mch_id, //
'nonce_str' => $this->createNoncestr(), //
'body' => $this->body, //
'out_trade_no'=> $this->out_trade_no, //
'total_fee' => $this->total_fee, //
'spbill_create_ip' => $_SERVER['REMOTE_ADDR'], // IP
'notify_url' => '', // , 1. 2.https
'openid' => $this->openid, // id
'trade_type' => 'JSAPI'// // jsAPi
);
//
$parameters['sign'] = $this->getSign($parameters);
$xmlData = $this->arrayToXml($parameters);
$return = $this->xmlToArray($this->postXmlCurl($xmlData, $url, 60));
return $return;
}
private static function postXmlCurl($xml, $url, $second = 30)
{
$ch = curl_init();
//
curl_setopt($ch, CURLOPT_TIMEOUT, $second);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); //
// header
curl_setopt($ch, CURLOPT_HEADER, FALSE);
//
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
//post
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 20);
curl_setopt($ch, CURLOPT_TIMEOUT, 40);
set_time_limit(0);
// curl
$data = curl_exec($ch);
//
if ($data) {
curl_close($ch);
return $data;
} else {
$error = curl_errno($ch);
curl_close($ch);
throw new WxPayException("curl , :$error");
}
}
// xml
private function arrayToXml($arr) {
$xml = "" ;
foreach ($arr as $key => $val) {
if (is_array($val)) {
$xml .= " . $key . ">" . arrayToXml($val) . "" . $key . ">";
} else {
$xml .= " . $key . ">" . $val . "" . $key . ">";
}
}
$xml .= "";
return $xml;
}
//xml
private function xmlToArray($xml) {
// xml
libxml_disable_entity_loader(true);
$xmlstring = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA);
$val = json_decode(json_encode($xmlstring), true);
return $val;
}
//
private function weixinapp() {
//
$unifiedorder = $this->unifiedorder();
//print_r($unifiedorder);
// halt($unifiedorder);
// if($unifiedorder['err_code_des'] == '201 '){
// return ''
// }
$parameters = array(
'appId' => $this->appid, // ID
'timeStamp' => '' . time() . '', //
'nonceStr' => $this->createNoncestr(), //
'package' => 'prepay_id=' . $unifiedorder['prepay_id'], // 201 , ,
'signType' => 'MD5'//
);
//
$parameters['paySign'] = $this->getSign($parameters);
return $parameters;
}
// : , 32
private 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;
}
// :
private function getSign($Obj) {
foreach ($Obj as $k => $v) {
$Parameters[$k] = $v;
}
// :
ksort($Parameters);
$String = $this->formatBizQueryParaMap($Parameters, false);
// : string KEY
$String = $String . "&key=" . $this->key;
// :MD5
$String = md5($String);
// :
$result_ = strtoupper($String);
return $result_;
}
/// : ,
private function formatBizQueryParaMap($paraMap, $urlencode) {
$buff = "";
ksort($paraMap);
foreach ($paraMap as $k => $v) {
if ($urlencode) {
$v = urlencode($v);
}
$buff .= $k . "=" . $v . "&";
}
$reqPar = '';
if (strlen($buff) > 0) {
$reqPar = substr($buff, 0, strlen($buff) - 1);
}
return $reqPar;
}
}