微信支付服务器端php,APP微信支付php服务端函数方法
namespace wxPay\Controller;
use Think\Controller;
class AjaxpayfunController extends Controller {
function index(){
header('Content-Type:text/html;Charset=utf-8'); //php頁面輸出 亂碼
//參數配置
$appid = '*********'; /*微信開放平臺上的應用id*/
$mch_id = '*************'; /*微信申請成功之后郵件中的商戶id*/
$api_key = '************************'; /*在微信商戶平臺上自己設定的api密鑰 32位*/
$out_trade_no = $this -> ordersinfo(); /*商戶訂單號*/
$price = $_GET['total']*1; /*支付金額*/
$price = 0.02*1; /*支付金額*/
$code = $this -> weChatPay($out_trade_no,$price,$appid,$mch_id,$api_key);
echo($code);
}
//入口函數
function weChatPay($order_num,$price,$appid,$mch_id,$api_key){
$json = array();//生成預支付交易單的必選參數:
$newPara = array();//所需各項參數
$newPara["appid"] = $appid; //應用APP appid
$newPara["mch_id"] = $mch_id; //微信支付商戶id//設備號
$newPara["device_info"] = $this -> createNoncestr(); //終端設備號(門店號或收銀設備ID),如沒有這里推薦使用函數生成隨機字符串
$newPara["nonce_str"] = $this -> createNoncestr(); //隨機字符串,不長于32位。推薦隨機數生成算法
$newPara["body"] = "添美愛車"; //商品描述 或應用名稱
$newPara["out_trade_no"] = $order_num; //商戶訂單號,這里是商戶自己的內部的訂單號
$newPara["total_fee"] = $price*100; //支付金額
$newPara["spbill_create_ip"] = $_SERVER["REMOTE_ADDR"]; //正在瀏覽當前頁面用戶的 IP 地址。
$newPara["notify_url"] = "http://**********/wxpay.php/Ajaxpayfun/wxpaynotify_url_sqlsta"; //支付成功后的回調地址注意,這里的url里面不要加參數
$newPara["trade_type"] = "APP"; //交易類型
$key = $api_key;// 密鑰:在商戶后臺個人安全中心設置//第一次簽名
$newPara["sign"] = $this -> appgetSign($newPara,$key);
//把數組轉化成xml格式
$xmlData = $this -> arrayToXml($newPara);
$get_data = $this -> sendPrePayCurl($xmlData);
//返回的結果進行判斷。
if($get_data["return_code"] == "SUCCESS" && $get_data["result_code"] == "SUCCESS"){
//根據微信支付返回的結果進行二次簽名
//二次簽名所需的隨機字符串
$newPara["nonce_str"] = $this -> createNoncestr(); //二次簽名所需的時間戳
$newPara["timeStamp"] = time().""; //二次簽名剩余參數的補充
$secondSignArray = array(
"appid" =>$newPara["appid"],
"noncestr" =>$newPara["nonce_str"],
"package" =>"Sign=WXPay",
"prepayid" =>$get_data["prepay_id"],
"partnerid" =>$newPara["mch_id"],
"timestamp" =>$newPara["timeStamp"],);
$json["success"] = 1;
$json["ordersn"] = $newPara["out_trade_no"]; //訂單號
$json["order_arr"] = $secondSignArray; //返給前臺APP的預支付訂單信息
$json["order_arr"]["sign"] = $this -> appgetSign($secondSignArray,$key); //預支付訂單簽名
$json["order_arr"]["out_trade_no"] = $newPara["out_trade_no"]; //商戶訂單號
$json["data"] = "預支付完成"; //預支付完成,在下方進行自己內部的業務邏輯
return json_encode($json["order_arr"]);
}else{
$json["success"] = 0;
$json["error"] =
$get_data["return_msg"];
return json_encode($json);
}
}
//商品訂單號碼生成方法可自定義
function ordersinfo(){
$shop = "TIANMEIAIC";
$date = date("YmdHi");
$time = time();
$out_trade_no = $shop.$date.$time;
return $out_trade_no;
}
//將數組轉換為xml格式
function arrayToXml($arr){
$xml = "";
foreach ($arr as $key=>$val){
if (is_numeric($val)){
$xml.="".$val."".$key.">";
}else{
$xml.="".$key.">";
}
}
$xml.="";
return $xml;
}
//發送請求
function sendPrePayCurl($xml,$second=30){
$url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
$ch = curl_init();
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
$data = curl_exec($ch);
curl_close($ch);
$data_xml_arr =$this -> XMLDataParse($data);
if($data_xml_arr){
return $data_xml_arr;
}else{
$error = curl_errno($ch);
echo"curl出錯,錯誤碼:$error"."
";
echo "錯誤原因查詢";
curl_close($ch);
return false;
}
}
//xml格式數據解析函數
function XMLDataParse($data){
$xml = simplexml_load_string($data,NULL,LIBXML_NOCDATA);
$array=json_decode(json_encode($xml),true);
return $array;
}
//隨機字符串
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;
}
/*格式化參數格式化成url參數 生成簽名sign*/
function appgetSign($Obj,$appwxpay_key){
foreach ($Obj as $k => $v){
$Parameters[$k] = $v;
}
//簽名步驟一:按字典序排序參數
ksort($Parameters);
$String = $this -> formatBizQueryParaMap($Parameters, false);
//echo "【string1】".$String."";
//簽名步驟二:在string后加入KEY
if($appwxpay_key){
$String = $String."&key=".$appwxpay_key;
}
//echo "【string2】".$String."";
//簽名步驟三:MD5加密
$String = md5($String);
//echo "【string3】 ".$String."";
//簽名步驟四:所有字符轉為大寫
$result_ = strtoupper($String);
//echo "【result】 ".$result_."";
return $result_;
}
//按字典序排序參數
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;
}
//微信支付成功后回調方法
public function wxpaynotify_url_sqlsta(){
$testxml = file_get_contents("php://input");
$jsonxml = json_encode(simplexml_load_string($testxml, 'SimpleXMLElement', LIBXML_NOCDATA));
$result = json_decode($jsonxml, true);//轉成數組,
if($result){
//如果成功返回了
$out_trade_no = $result['out_trade_no'];
$transaction_id = $result['transaction_id'];
if($result['return_code'] == 'SUCCESS' && $result['result_code'] == 'SUCCESS'){
//執行業務邏輯改變訂單狀態等操作
$orderssave = $this -> orderssqlstasave($out_trade_no,$transaction_id);
}
}
}
//數據庫訂單數據修改方法
public function orderssqlstasave($out_trade_no,$transaction_id){
//查詢創建訂單表 where("out_trade_no='".$out_trade_no."' and paysta=1")
$where['paysta'] = 1;
$where['out_trade_no'] = $out_trade_no;
$list = M("orders") -> where($where) -> find();
if ($list && $list['transaction_id'] == '') {
$data['id'] = $list['id'];
$data['transaction_id'] = $transaction_id;
//查詢出來有該訂單 就改變狀態
$save = M("orders") -> save($data);
if ($save) {
return $save;
}
}
}
}
總結
以上是生活随笔為你收集整理的微信支付服务器端php,APP微信支付php服务端函数方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 全功能笔记软件 Notion v2.0.
- 下一篇: 东大18秋计算机基础在线作业3,东大18