Android安卓原生接入微信app支付PHP服务端
Android安卓接入微信app支付PHP服务端
1.进入微信商户平台查看统一下单接口文档。
在查看完统一下单文档后,能够看到需要传递给微信“统一下单接口”地址的参数有哪些
统一下单文档地址:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_1
2.查看完下单接口之后,我们知道要传递过去的参数有,
Appid(在微信开放平台能够看到自己的appid);
mch_id(微信商户平台的id);
nonce_str(随机字符串,可自己生成,只要长度不超过32为就可以)
Body(商品描述,例:游戏币充值);
out_trade_no(商品订单号,可自己生成);
total_fee(商品价格,自己设置,100代表1元,因为微信默认是按分计算的);
spbill_create_ip(ip地址,也可以自己随便填写,不影响支付);
notify_url(通知地址,用户支付成功后,微信主动通知服务器,从而进行操作,测试时也可先随便填写一个)
trade_type(交易类型:App支付就填写APP)
交易类型:可到https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=4_2 这个地址去看下文档
sign(现在还差最重要,也是最容易出错的一个参数sign签名没有说到,sign签名其实就是将所有要传过去的参数拼接到一起,再拼接一个key=商户平台的密匙,再进行一个md5加密,后面我将会举出实例)
上面讲到的是集成微信支付,必须要传递过去的参数,下面将对这些参数中必须要自己写的参数给出实例,大家可以直接复制
3.参数实例
nonce_str随机字符串,自己生成的
function getNonceStr() {
$code = "";
for ($i=0; $i < 10; $i++) {
$code .= mt_rand(1000,2000); //获取随机数
}
$nonceStrTemp = md5($code);
$nonce_str = mb_substr($nonceStrTemp, 1,30); //MD5加密后截取30位字符
return $nonce_str;
}
$nonce_str=getNonceStr();
out_trade_no商户订单号
$out_trade_no =date('YmdHis').rand(10000000,99999999);
sign签名,自己参照微信文档,接口规则,安全文档拼接写
$str1="appid=$appid&body=$body&mch_id=$mch_id&nonce_str=$nonce_str¬ify_url=$notify_url&out_trade_no=$out_trade_no&spbill_create_ip=$spbill_create_ip&total_fee=$total_fee&trade_type=$trade_type&key=dsdsd3edwdwedewdcwededsdsdsdswdw";
$sign=strtoupper(md5($str1));//签名md5加密后,转换为大写
4.以上几步都弄完了之后,我们现在要将参数组成xml字符串,因为微信微信接收的参数和返回的参数都是xml的
拼接xml
$post_data =<<<xml
<xml>
<appid><![CDATA[自己填appid]]></appid>
<body><![CDATA[自己填商品介绍]]></body>
<mch_id><![CDATA[自己填商户id]]></mch_id>
<nonce_str><![CDATA[自己填随机字符串]]></nonce_str>
<notify_url><![CDATA[自己填回调地址]]></notify_url>
<out_trade_no><![CDATA[$out_trade_no]]></out_trade_no>
<spbill_create_ip><![CDATA[自己填ip地址]]></spbill_create_ip>
<total_fee><![CDATA[$total_fee]]></total_fee>
<trade_type><![CDATA[自己填支付类型,做app就填 app]]></trade_type>
<sign><![CDATA[填写签名,就是上面经过md5加密的]]></sign>
</xml>
xml;
5.拼接xml成功后,我们就可以通过post方式将数据发送给微信了
post方式将xml发送给微信
//初始化
$curl = curl_init();
//设置抓取的url
curl_setopt($curl, CURLOPT_URL, 'https://api.mch.weixin.qq.com/pay/unifiedorder');
//设置头文件的信息作为数据流输出
curl_setopt($curl, CURLOPT_HEADER, 0);
//设置获取的信息以文件流的形式返回,而不是直接输出。
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
//设置post方式提交
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS,$post_data);
$data = curl_exec($curl);
//关闭URL请求
curl_close($curl);
$data就是微信返回过来的数据,用echo输出数据是什么也看不到的,这个问题我做的时候还找了一段时间的原因,因为微信返回过来的数据是一个xml,xml在浏览器就被解析了,中间的内容又是被注释的,
所以看页面上什么都没有,如果用echo输出的话,大家可以查看源文件就可以看到了
6.到了这里我们已经成功了一大半了,如果微信返回的数据没有问题,会返回一个prepay_id给我们
然后我们将微信返回过来的参数拼接一下发送给前端
我们查看微信调起支付接口文档,看看前端需要一些什么参数
前端需要的参数文档地址:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_12&index=2
因为传递给前端的参数需要微信返回的数据,所以我们必须将微信返回过来的数据转换成数组,才能取出微信返回的参数
function Array1($xml)
{
//禁止引用外部xml实体
libxml_disable_entity_loader(true);
$values = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
return $values;
}
$ar=Array1($data);//将xml转换成数组的结果,执行这个函数就将微信返回的数据变成数组了
到这里的时候我们需要注意的是返回给前端的参数,同样有一个sign签名,所以我们这里又要签名一次,签名方法和上面说的一样,就是将需要传递的参数拼接成字符串,然后md5加密
7.二次签名和返回给前端数据的代码
//获取当前时间的时间戳
$time=intval(time());
//进行二次签名
$str2="appid=$ar[appid]&noncestr=$nonce_str&package=Sign=WXPay&partnerid=$mch_id&prepayid=$ar[prepay_id]×tamp=$time&key=dsdsd3edwdwedewdcwededsdsdsdswdw";
$sign1=strtoupper(md5($str2));//签名md5加密后,转换为大写
echo "{\"appid\":\"$ar[appid]\",\"noncestr\":\"$nonce_str\",\"package\":\"Sign=WXPay\",\"partnerid\":\"$mch_id\",\"prepayid\":\"$ar[prepay_id]\",\"timestamp\":$time,\"sign\":\"$sign1\"}";
- 整体代码,上面教程最好是一步一步看,下面我将整体代码贴出来,大家也可以直接使用,修改下统一下单的参数就可以了
<?php
/**
* 发送post请求
* @param string $url 请求地址
* @param array $post_data post键值对数据
* @return string
*/
header("Content-Type: text/html; charset=utf-8");
header("Access-Control-Allow-Origin: *");
//使用方法
$appid="99999999999";//微信appid,在开放平台看
$mch_id="999999999";//商户平台id,在商户平台查看
//nonce_str随机字符串,自己生成的
$index=0;
if($index==0){
$total_fee = 888; //价格
}
function getNonceStr() {
$code = "";
for ($i=0; $i < 10; $i++) {
$code .= mt_rand(1000,2000); //获取随机数
}
$nonceStrTemp = md5($code);
$nonce_str = mb_substr($nonceStrTemp, 1,30); //MD5加密后截取30位字符
return $nonce_str;
}
$nonce_str=getNonceStr();
//商品描述
$body="填写商品描述";
//商户订单号
$out_trade_no = date('YmdHis').rand(10000000,99999999);
//总金额
//$total_fee=8800;
//$total_fee=16800;
//终端ip
$spbill_create_ip='139.159.226.163';
//通知地址
$notify_url="http://www.baidu.com";
//交易类型
$trade_type="APP";
//附加数据
$attach=json_encode([1,2]);
//签名,自己参照微信文档,接口规则,安全文档拼接写
$str1="appid=$appid&attach=$attach&body=$body&mch_id=$mch_id&nonce_str=$nonce_str¬ify_url=$notify_url&out_trade_no=$out_trade_no&spbill_create_ip=$spbill_create_ip&total_fee=$total_fee&trade_type=$trade_type&key=fdffdsfdvnAADMWHFddscvhfhjkaAAAn";
$sign=strtoupper(md5($str1));//签名md5加密后,转换为大写
//要传递给微信的数据
$post_data =<<<xml
<xml>
<appid><![CDATA[$appid]]></appid>
<attach><![CDATA[$attach]]></attach>
<body><![CDATA[$body]]></body>
<mch_id><![CDATA[$mch_id]]></mch_id>
<nonce_str><![CDATA[$nonce_str]]></nonce_str>
<notify_url><![CDATA[$notify_url]]></notify_url>
<out_trade_no><![CDATA[$out_trade_no]]></out_trade_no>
<spbill_create_ip><![CDATA[$spbill_create_ip]]></spbill_create_ip>
<total_fee><![CDATA[$total_fee]]></total_fee>
<trade_type><![CDATA[APP]]></trade_type>
<sign><![CDATA[$sign]]></sign>
</xml>
xml;
//初始化
$curl = curl_init();
//设置抓取的url
curl_setopt($curl, CURLOPT_URL, 'https://api.mch.weixin.qq.com/pay/unifiedorder');
//设置头文件的信息作为数据流输出
curl_setopt($curl, CURLOPT_HEADER, 0);
//设置获取的信息以文件流的形式返回,而不是直接输出。
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
//设置post方式提交
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS,$post_data);
$data = curl_exec($curl);
//关闭URL请求
curl_close($curl);
//将微信返回过来的xml数据转换成数组
function xmlToArray($xml)
{
//禁止引用外部xml实体
libxml_disable_entity_loader(true);
$values = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
return $values;
}
$ar=xmlToArray($data);//将xml转换成数组的结果
//获取当前时间的时间戳
$time=intval(time());
//进行二次签名
$str2="appid=$ar[appid]&noncestr=$nonce_str&package=Sign=WXPay&partnerid=$mch_id&prepayid=$ar[prepay_id]×tamp=$time&key=fdffdsfdvnAADMWHFddscvhfhjkaAAAn";
$sign1=strtoupper(md5($str2));//签名md5加密后,转换为大写
//echo "{\"appid\":\"$ar[appid]\",\"noncestr\":\"$nonce_str\",\"package\":\"Sign=WXPay\",\"partnerid\":\"$mch_id\",\"prepayid\":\"$ar[prepay_id]\",\"timestamp\":$time,\"sign\":\"$sign1\"}";
echo json_encode([
appid=>$ar[appid],
noncestr=>$nonce_str,
package=>"Sign=WXPay",
partnerid=>$mch_id,
prepayid=>$ar[prepay_id],
timestamp=>$time,
sign=>$sign1
]);
?>
Android安卓原生接入微信app支付PHP服务端相关推荐
- 微信app支付功能-服务端的实现-python3版
微信app支付功能-服务端的实现-python3版 一:需求说明 二:微信app支付处理流程 三:所需依赖 3.1 支付配置 四:接口开发 4.1 创建订单接口 4.2 微信异步回调接口 4.3 订单 ...
- 支付宝app支付功能-服务端的实现-python3版
支付宝app支付功能-服务端的实现-python3版 一:需求说明 二:支付宝app支付处理流程 三:所需依赖 3.1 依赖库 3.2 支付配置 3.2.1 沙箱环境配置 3.2.2 正式环境配置 四 ...
- 支付宝APP支付Java服务端
支付宝APP支付Java服务端: 公司项目要求对接支付宝进行支付功能,这边做出整理方便以后使用(支付宝的支付对接还是很简单的). 1):去支付宝开放平台,-1.注册账号,2.创建应用 3.配置应用 4 ...
- 如何申请接入微信APP支付文章
一.注册开发平台,并创建应用 1.打开微信开放平台并登录:https://open.weixin.qq.com/ PS:开发平台没有注册账号的,可以点击注册账号(企业类型) 2.点击创建移动应用,并填 ...
- app中接入微信H5支付总结
1. 支付宝app支付 2. 支付宝当面付 3. 支付宝手机网站支付 1.为什么没有直接接入微信app支付,而是采用H5支付? 因为app支付需要另外去微信开放平台申请一个appId,而公司的app ...
- 微信APP支付申请流程
1. 申请流程指引 1.1 申请流程图 1.2 申请接入步骤详细说明 1.2.1 到微信开放平台添加移动应用 目前仅对已通过认证的开发者创建的移动应用开放申请,请登录微信开放平台,添加移动应用,等待审 ...
- Android版-微信APP支付
首发地址: Android版-微信APP支付 欢迎留言.转发 微信极速开发系列文章(微信支付.授权获取用户信息等):点击这里 目录 1.注册账号.开发者认证 2.添加应用 3.申请微信支付 4.技术开 ...
- 微信无法连接支付服务器,App接入微信H5支付常见错误及原因
在App上接入微信H5支付一般都会遇到一些错误.本文讨论了这些错误的解决方案和背后的原因,希望能让读者能少踩些坑. 错误可以分为两类:一是H5支付域名设置错误,二是URL Scheme跳转App错误. ...
- android微信支付都需要什么意思,Android开发微信APP支付功能的要点小结
基本概念 包名值得是你APP的包,在创建工程时候设置的,需要在微信支付平台上面设置. 签名指的是你生成APK时候所用的签名文件的md5,去掉:全部小写,需要在微信支付平台上面设置. 调试阶段,签名文件 ...
最新文章
- 使用Android studio完成”仿QQ的头像选择弹出的对话框“步骤及知识梳理
- JAVA教程 第六讲 Java的线程和Java Applet(二)
- 当精准广告遇到大数据
- uniapp 默认的 ‘再按一次退出应用’ 提示语修改方法
- HTTP调试工具:Fiddler 介绍二
- 将RGB转换成ToWin32值
- 《Redis官方文档》Data types—数据类型
- (一)netty介绍
- linux安装mongodb并创建用户
- codeforces#253 D - Andrey and Problem里的数学知识
- 电脑备份,电脑怎么备份系统,小白提供2种备份方法
- 排序算法——鸡尾酒排序
- 2022最新电脑CPU性能天梯图
- 项目中的用户鉴权是如何实现的?
- java反射获取字段的顺序6_反射之获取字段
- vc++6.0/使用VisualC++6.0创建MFC基本对话框程序制作数字钟表教程
- Charles抓包APP
- 离别信——CJ-麦科勒姆亲笔:致亲爱的波特兰
- 【软件工程】— 文档总结
- 550分左右的理科大学计算机,理科考550分左右可以报考哪些大学2021