




下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【移动应用开发技术】如何通过PHP来实现APP微信支付
这篇文章主要介绍了如何通过PHP来实现APP微信支付,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让在下带着大家一起了解一下。一、PHP后台后台生成预支付交易单,返回正确的预支付交易回话标识后再在APP里面调起支付!官方文档:/wiki/doc/api/app/app.php?chapter=9_1根据文档拼接微信需要的参数,这里需要几个方法,直接上代码!传输给微信的参数要组装成xml格式发送,传如参数数组!public
function
ToXml($data=array())
{
if(!is_array($data)
||
count($data)
<=
0)
{
return
'数组异常';
}
$xml
=
"<xml>";
foreach
($data
as
$key=>$val)
{
if
(is_numeric($val)){
$xml.="<".$key.">".$val."</".$key.">";
}else{
$xml.="<".$key."><![CDATA[".$val."]]></".$key.">";
}
}
$xml.="</xml>";
return
$xml;
}2.生成随机字符串,微信所需参数!这里方法很多,看自己爱好都行!function
rand_code(){
$str
=
'0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';//62个字符
$str
=
str_shuffle($str);
$str
=
substr($str,0,32);
return
$str;
}3.这里是微信比较重要的一步了,这个方法会多次用到!生成签名private
function
getSign($params)
{
ksort($params);
//将参数数组按照参数名ASCII码从小到大排序
foreach
($params
as
$key
=>
$item)
{
if
(!empty($item))
{
//剔除参数值为空的参数
$newArr[]
=
$key.'='.$item;
//
整合新的参数数组
}
}
$stringA
=
implode("&",
$newArr);
//使用
&
符号连接参数
$stringSignTemp
=
$stringA."&key="."************************";
//拼接key
//
key是在商户平台API安全里自己设置的
$stringSignTemp
=
MD5($stringSignTemp);
//将字符串进行MD5加密
$sign
=
strtoupper($stringSignTemp);
//将所有字符转换为大写
return
$sign;
}4.传递参数给微信,生成预支付订单!接收微信返回的数据,在反给APP端,APP端调用支付接口,完成支付!APP端所需参数见微信文档:/wiki/doc/api/app/app.php?chapter=9_12&index=2public
function
wx_pay()
{
$nonce_str
=
$this->rand_code();
//调用随机字符串生成方法获取随机字符串
$data['appid']
='wxdbc5dc*******';
//appid
$data['mch_id']
=
'1493*****'
;
//商户号
$data['body']
=
"APP支付测试";
$data['spbill_create_ip']
=
$_SERVER['HTTP_HOST'];
//ip地址
$data['total_fee']
=
1;
//金额
$data['out_trade_no']
=
time().mt_rand(10000,99999);
//商户订单号,不能重复
$data['nonce_str']
=
$nonce_str;
//随机字符串
$data['notify_url']
=
'/wx_notify';
//回调地址,用户接收支付后的通知,必须为能直接访问的网址,不能跟参数
$data['trade_type']
=
'APP';
//支付方式
//将参与签名的数据保存到数组
注意:以上几个参数是追加到$data中的,$data中应该同时包含开发文档中要求必填的剔除sign以外的所有数据
$data['sign']
=
$this->getSign($data);
//获取签名
$xml
=
$this->ToXml($data);
//数组转xml
//curl
传递给微信方
$url
=
"/pay/unifiedorder";
//header("Content-type:text/xml");
$ch
=
curl_init();
curl_setopt($ch,CURLOPT_URL,
$url);
if(stripos($url,"https://")!==FALSE){
curl_setopt($ch,
CURLOPT_SSLVERSION,
CURL_SSLVERSION_TLSv1);
curl_setopt($ch,
CURLOPT_SSL_VERIFYPEER,
FALSE);
curl_setopt($ch,
CURLOPT_SSL_VERIFYHOST,
FALSE);
}
else
{
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,TRUE);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,2);//严格校验
}
//设置header
curl_setopt($ch,
CURLOPT_SSLVERSION,
CURL_SSLVERSION_TLSv1);
curl_setopt($ch,
CURLOPT_HEADER,
FALSE);
//要求结果为字符串且输出到屏幕上
curl_setopt($ch,
CURLOPT_RETURNTRANSFER,
TRUE);
//设置超时
curl_setopt($ch,
CURLOPT_TIMEOUT,
30);
curl_setopt($ch,
CURLOPT_POST,
TRUE);
//传输文件
curl_setopt($ch,
CURLOPT_POSTFIELDS,
$xml);
//运行curl
$data
=
curl_exec($ch);
//返回结果
if($data){
curl_close($ch);
//返回成功,将xml数据转换为数组.
$re
=
$this->FromXml($data);
if($re['return_code']
!=
'SUCCESS'){
json("201",'签名失败');
}
else{
//接收微信返回的数据,传给APP!
$arr
=array(
'prepayid'
=>$re['prepay_id'],
'appid'
=>
'wxdbc5dc*****',
'partnerid'
=>
'14937****',
'package'
=>
'Sign=WXPay',
'noncestr'
=>
$nonce_str,
'timestamp'
=>time(),
);
//第二次生成签名
$sign
=
$this->getSign($arr);
$arr['sign']
=
$sign;
json('200','签名成功',$arr);
}
}
else
{
$error
=
curl_errno($ch);
curl_close($ch);
json('201',"curl出错,错误码:$error");
}
}5.将xml数据转换为数组,接收微信返回数据时用到.public
function
FromXml($xml)
{
if(!$xml){
echo
"xml数据异常!";
}
//将XML转为array
//禁止引用外部xml实体
libxml_disable_entity_loader(true);
$data
=
json_decode(json_encode(simplexml_load_string($xml,
'SimpleXMLElement',
LIBXML_NOCDATA)),
true);
return
$data;
}二、APP支付成功后,会调用你填写的回调地址.返回参数详见微信文档:/wiki/doc/api/app/app.php?chapter=9_7&index=3//
微信支付回调
function
wx_notify(){
//接收微信返回的数据数据,返回的xml格式
$xmlData
=
file_get_contents('php://input');
//将xml格式转换为数组
$data
=
$this->FromXml($xmlData);
//用日志记录检查数据是否接受成功,验证成功一次之后,可删除。
$file
=
fopen('./log.txt',
'a+');
fwrite($file,var_export($data,true));
//为了防止假数据,验证签名是否和返回的一样。
//记录一下,返回回来的签名,生成签名的时候,必须剔除sign字段。
$sign
=
$data['sign'];
unset($data['sign']);
if($sign
==
$this->getSign($data)){
//签名验证成功后,判断返回微信返回的
if
($data['result_code']
==
'SUCCESS')
{
//根据返回的订单号做业务逻辑
$arr
=
array(
'pay_status'
=>
1,
);
$re
=
M('order')->where(['order_sn'=>$data['out_trade_no']])->save($arr);
//处理完成之后,告诉微信成功结果!
if($re){
echo
'<xml>
<return_code><![CDATA[SUCCESS]]></return_code>
<return_msg><![CDATA[OK]]></return_msg>
</xml>';exit();
}
}
//支付失败,输出错误信息
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 基于定性坐标的三维方向关系推理
- 二维无机填料对酚酞-对苯型聚芳醚腈的结晶行为与性能影响研究
- 儿童成长钙铁锌咀嚼片行业跨境出海战略研究报告
- 车载式水质监测仪器仪表企业县域市场拓展与下沉战略研究报告
- MoS2基突触晶体管的构建及生物行为模拟研究
- 化学药物质量控制新方法行业深度调研及发展战略咨询报告
- 棉制台布企业县域市场拓展与下沉战略研究报告
- 基因测序样本库管理系统行业深度调研及发展战略咨询报告
- 锰氧化物企业ESG实践与创新战略研究报告
- 制药用自动化仓储系统企业制定与实施新质生产力战略研究报告
- 计算机网络基础与应用中职完整全套教学课件
- 《触不可及》影视鉴赏
- 北师大版 四年级下册心理健康教育 失败不可怕 |教案
- 医师定期考核人文医学考试题库500题(含参考答案)
- 读书分享课件:《一句顶一万句》
- 物业消防安全管理培训【共54张课件】
- 空心杯电机基础知识
- DL-T+5839-2021土石坝安全监测系统施工技术规范
- 历年交管12123驾照学法减分复习题库带答案下载
- 人教鄂教版-科学-三年级下册-知识点
- 2024-2034年中国注射用赖氨匹林行业市场竞争格局及投资前景展望报告
评论
0/150
提交评论