小程序開發中經常碰到支付的問題,今天鄭州小程序開發公司開拓者科技跟大家分享一下相關的經驗。
一、申請微信支付
想要對接微信支付,就必須先想微信支付官方提交資料申請支付賬號,通常微信服務號、微信小程序內都有支付申請的接口,申請一次就夠了。
二、微信小程序的支付對接
1:下列參數分解表示:
$data["appid"] = "";
$data["body"] = "支付";
$data["mch_id"] = ""; //商戶平臺號
$data["nonce_str"] = $this->nonce_str();//隨機數,會顯示在下圖
$data["notify_url"] = '';//回調地址。在當前控制器寫回調方法,注意路徑
$data["openid"] = xx;//付款人的openid
$data["out_trade_no"] = xxx;訂單號
$data["spbill_create_ip"] = $request->ip();//當前請求的ip,用官方獲取函數
$data["total_fee"] = 0.01 * 100;//付款的金額
$data["trade_type"] = "JSAPI";//支付的方式
$sign = $this->sign($data);//加密
$data['sign'] = $sign;
$xmldata = $this->xml($data);
$url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
$res = $this->http_request($url, $xmldata);
$result = $this->getxml($res);
if ($result['RETURN_CODE'] == 'SUCCESS') {
$info['appId'] = '';
$info['timeStamp'] = xx;當前時間戳就可以
$info['nonceStr'] = $this->nonce_str();
$info['package'] = 'prepay_id=' . PREPAY_ID;//此處可以自己研究一下
$info['signType'] = 'MD5';
$info["paySign"] = $this->sign($info);
$callback_data = ['code' => 200, 'msg' => "獲取成功", "data" => $info];
}else{
$callback_data = ['code' => 500, 'msg' => "獲取失敗", "data" => ''];
}
return json($callback_data);
2:http_request($url, $xmldata);
這部分是請求的數據,通過curl請求數據。復制就好了
function http_request($url,$rawData){
$ch = curl_init();
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_HEADER,0);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,10);
curl_setopt($ch,CURLOPT_POST,1);
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);
curl_setopt($ch,CURLOPT_POSTFIELDS,$rawData);
// curl_setopt($ch,CURLOPT_HTTPHEADER,array('content-Type:text'));
$data = curl_exec($ch);
curl_close($ch);
return $data;
}
3:隨機數---nonce_str
function nonce_str(){
$result = '';
$str = 'QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm';
for($i = 0;$i< 32;$i++){
$result .= $str[rand(0,48)];
}
return $result;
}
4:getxml===獲取xml
function getxml($xml){
$p = xml_parser_create();
xml_parse_into_struct($p,$xml,$index);
xml_parser_free($p);
$data = '';
foreach($index as $key => $value){
if($value['tag'] == "RETURN_CODE"){
$data['RETURN_CODE'] = $value['value'];
}
}
return $data;
}
5:回調函數接收:
public function notify_url(){
$receipt = file_get_contents("php://input");//可以寫入日志自己接收的數據
$post_data = $this->xmlToArray($receipt);
$postSign = $post_data['sign'];
$order_number = $post_data['out_trade_no'];// 訂單可以查看一下數據庫是否有這個訂單
if ($post_data['return_code'] == 'SUCCESS' && $postSign) {
if (//寫入自己的邏輯) {
echo '<xml><return_code><![CDATA[SUCCESS]]></return_code> <return_msg><![CDATA[OK]]></return_msg></xml>';
}
} else {
echo '<xml><return_code><![CDATA[FAIL]]></return_code> <return_msg><![CDATA[ERROR]]></return_msg></xml>';
}
} else {
echo '<xml> <return_code><![CDATA[SUCCESS]]></return_code> <return_msg><![CDATA[OK]]></return_msg> </xml>';
}
} else {
// 寫個日志記錄
// file_put_contents('wxpayerrorlog.txt', $post_data['return_code'] . PHP_EOL, FILE_APPEND);
echo '微信支付失敗';
}
}
//xml轉換成數組
private function xmlToArray($xml) {
libxml_disable_entity_loader(true);
$data = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
return $data;
}