php开发APP支付功能中,涉及到微信APP支付功能。为了考虑数据的严密性,加密的过程全部都需要在服务端进行生成。微信APP支付与支付宝的还不太一样。微信APP支付需要二次的加密请求才可以完成整个服务端的任务。
1、首先第一次需要加密请求拿到prepay_id,就是预支付订单号。
2、接着在拿得到的预支付订单号进行加密,生成最终APP端请求的参数。
3、注意的是,微信开发中请求和发送的结构都是xml。
以下代码直接可以复制,简单修改点参数就可以使用。/*微信签名 by gm 2017-11-02*/
public function wxsignature(){
$body = I('post.body'); // 描述
$title = I('post.title'); // 标题
$order = I('post.order'); // 订单号
$price = I('post.price'); // 价格
$d['appid'] = $this->wxappid;
$d['mch_id']= $this->wxmch_id;
$d['nonce_str']= \Org\Util\String::randString(20);
$d['body'] = $body;
$d['out_trade_no']= $order;
$d['total_fee']= $price*100;
$d['spbill_create_ip']= get_client_ip();
$d['notify_url']= 'http://www.shuchengxian.com/';
$d['trade_type']= 'APP';
// 获取签名
$d['sign'] = $this->_getwxsign($d);
// 拼装数据
$xml = $this->_setxmldata($d);
// 发送请求
$res = $this->_sendprePaycurl($xml);
if($res['return_code'] == 'SUCCESS'){
// 二次签名
$t['appid'] = $this->wxappid;
$t['noncestr'] = \Org\Util\String::randString(20);
$t['package'] = "Sign=WXPay";
$t['prepayid'] = $res['prepay_id'];
$t['partnerid'] = $this->wxmch_id;
$t['timestamp'] = time();
$t['sign'] = $this->_getsecondsign($t);
$this->ajaxReturn(returncode(array($t),'获取成功',200));
}else{
$this->ajaxReturn(returncode(array(),'获取失败',500));
}
}
//通过curl发送数据给微信接口的函数
private function _sendprePaycurl($xmlData) {
$url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
$header[] = "Content-type: text/xml";
$curl = curl_init();
curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $xmlData);
$data = curl_exec($curl);
if (curl_errno($curl)) {
print curl_error($curl);
}
curl_close($curl);
return $this->_xmldataparse($data);
}
//xml格式数据解析函数
private function _xmldataparse($data){
$msg = array();
$msg = (array)simplexml_load_string($data, 'SimpleXMLElement', LIBXML_NOCDATA);
return $msg;
}
/* 拼装请求的数据xml 生成xml数据格式 by gm 2017-11-2*/
private function _setxmldata($data) {
$xml = "
";
$data = sprintf($xml, $data['appid'], $data['body'], $data['mch_id'], $data['nonce_str'], $data['notify_url'], $data['out_trade_no'], $data['spbill_create_ip'], $data['total_fee'], $data['trade_type'], $data['sign']);
return $data;
}
/*生成微信签名 by gm 2017-11-02*/
private function _getwxsign($data){
ksort($data);
$str = '';
foreach ($data as $key => $value) {
$str .= !$str ? $key . '=' . $value : '&' . $key . '=' . $value;
}
$str.='&key='.$this->wxkey;
$sign = strtoupper(md5($str));
return $sign;
}
/*获取二次签名 by gm 2017-11-02*/
private function _getsecondsign($data){
$sign = array(
"appid"=>$data['appid'],
"noncestr"=>$data['noncestr'],
"package"=>$data['package'],
"prepayid"=>$data['prepayid'],
"partnerid"=>$data['partnerid'],
"timestamp"=>$data['timestamp'],
);
return $this->_getwxsign($sign);
}
以上就是PHP微信APP支付的整个服务器端的执行代码。