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\"}";

  1. 整体代码,上面教程最好是一步一步看,下面我将整体代码贴出来,大家也可以直接使用,修改下统一下单的参数就可以了

<?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服务端相关推荐

  1. 微信app支付功能-服务端的实现-python3版

    微信app支付功能-服务端的实现-python3版 一:需求说明 二:微信app支付处理流程 三:所需依赖 3.1 支付配置 四:接口开发 4.1 创建订单接口 4.2 微信异步回调接口 4.3 订单 ...

  2. 支付宝app支付功能-服务端的实现-python3版

    支付宝app支付功能-服务端的实现-python3版 一:需求说明 二:支付宝app支付处理流程 三:所需依赖 3.1 依赖库 3.2 支付配置 3.2.1 沙箱环境配置 3.2.2 正式环境配置 四 ...

  3. 支付宝APP支付Java服务端

    支付宝APP支付Java服务端: 公司项目要求对接支付宝进行支付功能,这边做出整理方便以后使用(支付宝的支付对接还是很简单的). 1):去支付宝开放平台,-1.注册账号,2.创建应用 3.配置应用 4 ...

  4. 如何申请接入微信APP支付文章

    一.注册开发平台,并创建应用 1.打开微信开放平台并登录:https://open.weixin.qq.com/ PS:开发平台没有注册账号的,可以点击注册账号(企业类型) 2.点击创建移动应用,并填 ...

  5. app中接入微信H5支付总结

    1. 支付宝app支付  2. 支付宝当面付 3. 支付宝手机网站支付 1.为什么没有直接接入微信app支付,而是采用H5支付? 因为app支付需要另外去微信开放平台申请一个appId,而公司的app ...

  6. 微信APP支付申请流程

    1. 申请流程指引 1.1 申请流程图 1.2 申请接入步骤详细说明 1.2.1 到微信开放平台添加移动应用 目前仅对已通过认证的开发者创建的移动应用开放申请,请登录微信开放平台,添加移动应用,等待审 ...

  7. Android版-微信APP支付

    首发地址: Android版-微信APP支付 欢迎留言.转发 微信极速开发系列文章(微信支付.授权获取用户信息等):点击这里 目录 1.注册账号.开发者认证 2.添加应用 3.申请微信支付 4.技术开 ...

  8. 微信无法连接支付服务器,App接入微信H5支付常见错误及原因

    在App上接入微信H5支付一般都会遇到一些错误.本文讨论了这些错误的解决方案和背后的原因,希望能让读者能少踩些坑. 错误可以分为两类:一是H5支付域名设置错误,二是URL Scheme跳转App错误. ...

  9. android微信支付都需要什么意思,Android开发微信APP支付功能的要点小结

    基本概念 包名值得是你APP的包,在创建工程时候设置的,需要在微信支付平台上面设置. 签名指的是你生成APK时候所用的签名文件的md5,去掉:全部小写,需要在微信支付平台上面设置. 调试阶段,签名文件 ...

最新文章

  1. 使用Android studio完成”仿QQ的头像选择弹出的对话框“步骤及知识梳理
  2. JAVA教程 第六讲 Java的线程和Java Applet(二)
  3. 当精准广告遇到大数据
  4. uniapp 默认的 ‘再按一次退出应用’ 提示语修改方法
  5. HTTP调试工具:Fiddler 介绍二
  6. 将RGB转换成ToWin32值
  7. 《Redis官方文档》Data types—数据类型
  8. (一)netty介绍
  9. linux安装mongodb并创建用户
  10. codeforces#253 D - Andrey and Problem里的数学知识
  11. 电脑备份,电脑怎么备份系统,小白提供2种备份方法
  12. 排序算法——鸡尾酒排序
  13. 2022最新电脑CPU性能天梯图
  14. 项目中的用户鉴权是如何实现的?
  15. java反射获取字段的顺序6_反射之获取字段
  16. vc++6.0/使用VisualC++6.0创建MFC基本对话框程序制作数字钟表教程
  17. Charles抓包APP
  18. 离别信——CJ-麦科勒姆亲笔:致亲爱的波特兰
  19. 【软件工程】— 文档总结
  20. 550分左右的理科大学计算机,理科考550分左右可以报考哪些大学2021

热门文章

  1. 《朱赟的技术管理课》核心笔记
  2. 我是怎么看friends练口语的(转贴)
  3. 软件工程学习之小学四则混合运算出题软件 Version 1.00 设计思路及感想
  4. Web前端知识CSS(清浮动的方法、CSS精灵图、滑动门)
  5. Python程序运行结束后发出提示音
  6. 《人性的弱点》第二章 获取喜爱的十二大技巧:读后感
  7. python pyside2 connect无法传递参数问题
  8. 安装micro/go-micro
  9. Oracle开发者中级第7课(层级查询)实验
  10. AST实战|AST入门与实战星球高频问题汇总(二)