前面介绍了APP微信开发的基本步骤,这次介绍一下开发前的准备工作。
一、注册、认证、创建APP应用并进行开户审核等工作
链接如下
https://open.weixin.qq.com/cgi-bin/frame?t=home/app_tmpl&lang=zh_CN
相关流程如下:
https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419317780&token=&lang=zh_CN
二、开始开发
开发者文档参考链接:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_1
APP支付模式为(ps:标注蓝色的即为服务器端需要做的操作):
商户系统和微信支付系统主要交互说明:
步骤1:用户在商户APP中选择商品,提交订单,选择微信支付。
步骤2:商户后台收到用户支付单,调用微信支付统一下单接口。
步骤3:统一下单接口返回正常的prepay_id,再按签名规范重新生成签名后,将数据传输给APP。参与签名的字段名为appId,partnerId,prepayId,nonceStr,timeStamp,package。注意:package的值格式为Sign=WXPay
步骤4:商户APP调起微信支付。
步骤5:商户后台接收支付通知。
步骤6:商户后台查询支付结果。
1、下载PHP服务器开发demo
下载demo链接:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1
2、开同微信支付功能,在Demo的lib/WxPay.Config.php中配置各个信息
classWxPayConfig
{
//=======【基本信息设置】=====================================
//
/**
*TODO: 修改这里配置为您自己申请的商户信息
* 微信公众号信息配置
*
* APPID:绑定支付的APPID(必须配置,开户邮件中可查看)
*
* MCHID:商户号(必须配置,开户邮件中可查看)
*
* KEY:商户支付密钥,参考开户邮件设置(必须配置,登录商户平台自行设置)
* 设置地址:https://pay.weixin.qq.com/index.php/account/api_cert
*
* APPSECRET:公众帐号secert(仅JSAPI支付的时候需要配置, 登录公众平台,进入开发者中心可设置),
* 获取地址:https://mp.weixin.qq.com/advanced/advanced?action=dev&t=advanced/dev&token=2005451881&lang=zh_CN
*@varstring
*/
constAPPID= 'wx426b3015555a46be';
constMCHID= '1225312702';
constKEY= 'e10adc3949ba59abbe56e057f20f883e';
constAPPSECRET= '01c6d59a3f9024db6336662ac95c8e74';
//=======【证书路径设置】=====================================
/**
*TODO:设置商户证书路径
* 证书路径,注意应该填写绝对路径(仅退款、撤销订单时需要,可登录商户平台下载,
* API证书下载地址:https://pay.weixin.qq.com/index.php/account/api_cert,下载之前需要安装商户操作证书)
*@varpath
*/
constSSLCERT_PATH= '../cert/apiclient_cert.pem';
constSSLKEY_PATH= '../cert/apiclient_key.pem';
//=======【curl代理设置】===================================
/**
*TODO:这里设置代理机器,只有需要代理的时候才设置,不需要代理,请设置为0.0.0.0和0
* 本例程通过curl使用HTTP POST方法,此处可修改代理服务器,
* 默认CURL_PROXY_HOST=0.0.0.0和CURL_PROXY_PORT=0,此时不开启代理(如有需要才设置)
*@varunknown_type
*/
constCURL_PROXY_HOST= "0.0.0.0";//"10.152.18.220";
constCURL_PROXY_PORT= 0;//8080;
//=======【上报信息配置】===================================
/**
*TODO:接口调用上报等级,默认紧错误上报(注意:上报超时间为【1s】,上报无论成败【永不抛出异常】,
* 不会影响接口调用流程),开启上报之后,方便微信监控请求调用的质量,建议至少
* 开启错误上报。
* 上报等级,0.关闭上报; 1.仅错误出错上报; 2.全量上报
*@varint
*/
constREPORT_LEVENL= 1;
}
3、统一下单,将返回的结果传递给客户端处理
functiondopayment_serviceorder($serviceorder)
{
//① 获取后台中的相关数据
$host= 'http://'.$_SERVER['HTTP_HOST'];
$notify_url=$host."/at/wxopenplatformpayagent/notify_url.html";//接受微信支付结果通知url
$appid= WxPayConfig::APPID;
$body= $serviceorder['order_title'];
$total_fee= $serviceorder["order_dealprice"] * 100;
$out_trade_no= $serviceorder['order_id'].date("YmdHis");
//②、统一下单,生成预支付交易单prepayid
$input= newWxPayUnifiedOrder();
$input->SetBody($body);//设置商品或支付单简要描述
$input->SetOut_trade_no($out_trade_no);//设置商户系统内部的订单号,32个字符内、可包含字母, 其他说明见商户订单号
$input->SetTotal_fee($total_fee);//设置订单总金额,只能为整数,详见支付金额
$input->SetTime_start(date("YmdHis"));//设置订单生成时间,格式为yyyyMMddHHmmss
$input->SetTime_expire(date("YmdHis",time() +60*10));//设置订单失效时间,格式为yyyyMMddHHmmss
$input->SetNotify_url($notify_url);//设置接收微信支付异步通知回调地址
$input->SetTrade_type("APP");//设置类型如下:JSAPI,NATIVE,APP
$order_data= WxPayApi::unifiedOrder($input);//统一下单
$order_data['timestamp'] = time();
$str= 'appid='.$order_data['appid'].'&noncestr='.$order_data['nonce_str'].'&package=Sign=WXPay&partnerid='.WxPayConfig::MCHID.'&prepayid='.$order_data['prepay_id'].'×tamp='.$order_data['timestamp'];
//③ 重新生成签名,并将结果返回给客户端
$order_data['sign'] = strtoupper(md5($str.'&key='.WxPayConfig::KEY));
$parameter= array(
'appid'=> $order_data['appid'],
'partnerid'=>$order_data['mch_id'],
'prepayid'=>$order_data['prepay_id'],
'package'=>'Sign=WXPay',
'noncestr'=>$order_data['nonce_str'],
'timestamp'=>$order_data['timestamp'],
'sign'=> $order_data['sign']
);
returnjson_encode($parameter);
}
4、调起支付接口--客户端完成
5、支付结果通知--统一下单时传递的notify_url
支付完成后,微信会把相关的支付结果和用户信息发送给商户,商户需要接收处理并返回应答
根据支付结果对订单进行处理
<?php
ini_set('date.timezone','Asia/Shanghai');
error_reporting(E_ERROR);
require_once"../lib/WxPay.Api.php";
require_once'../lib/WxPay.Notify.php';
require_once'log.php';
//初始化日志
$logHandler=newCLogFileHandler("../logs/".date('Y-m-d').'.log');
$log= Log::Init($logHandler,15);
classPayNotifyCallBackextendsWxPayNotify
{
//查询订单
public function Queryorder($transaction_id)
{
$input= newWxPayOrderQuery();
$input->SetTransaction_id($transaction_id);
$result= WxPayApi::orderQuery($input);
Log::DEBUG("query:". json_encode($result));
if(array_key_exists("return_code",$result)
&&array_key_exists("result_code",$result)
&&$result["return_code"] == "SUCCESS"
&&$result["result_code"] == "SUCCESS")
{
return true;
}
return false;
}
//重写回调处理函数
public function NotifyProcess($data, &$msg)
{
Log::DEBUG("call back:" . json_encode($data));
$notfiyOutput= array();
if(!array_key_exists("transaction_id",$data)){
$msg= "输入参数不正确";
return false;
}
//查询订单,判断订单真实性
if(!$this->Queryorder($data["transaction_id"])){
$msg= "订单查询失败";
return false;
}
//根据 $data["out_trade_no"] 订单号 更新订单状态 //执行更新
return true;
}
}
Log::DEBUG("begin notify");
$notify= newPayNotifyCallBack();
$notify->Handle(false);
6、关闭订单
相关文章
- C#开发PACS医学影像三维重建(十四):基于能量模型算法将曲面牙床展开至二维平面
- 基于Vue.js的uni-app前端框架结合.net core开发跨平台project
- APP开发,微信第三方登录的介绍
- iOS开发总结--三方平台开发之微信支付
- 基于 abp vNext 和 .NET Core 开发博客项目 - 博客接口实战篇(三)
- 基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(三)
- 使用 CodeIgniter 框架快速开发 PHP 应用(三)
- 一款基于 Android 开发的离线版的 MM 图片浏览 App
- php微信公众平台开发(三)订阅事件处理
- 认识Web前端、Web后端、桌面app和移动app新开发模式 - 基于Node.js环境和VS Code工具