前面介绍了APP微信开发的基本步骤,这次介绍一下开发前的准备工作。
一、注册、认证、创建APP应用并进行开户审核等工作
链接如下
相关流程如下:
二、开始开发
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
2、开同微信支付功能,在Demo的lib/WxPay.Config.php中配置各个信息
class
WxPayConfig
{
//=======【基本信息设置】=====================================
//
/**
*
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
*
@var
string
*/
const
APPID
=
'wx426b3015555a46be'
;
const
MCHID
=
'1225312702'
;
const
KEY
=
'e10adc3949ba59abbe56e057f20f883e'
;
const
APPSECRET
=
'01c6d59a3f9024db6336662ac95c8e74'
;
//=======【证书路径设置】=====================================
/**
*
TODO:设置商户证书路径
* 证书路径,注意应该填写绝对路径(仅退款、撤销订单时需要,可登录商户平台下载,
* API证书下载地址:
https://pay.weixin.qq.com/index.php/account/api_cert,下载之前需要安装商户操作证书)
*
@var
path
*/
const
SSLCERT_PATH
=
'../cert/apiclient_cert.pem'
;
const
SSLKEY_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,此时不开启代理(如有需要才设置)
*
@var
unknown_type
*/
const
CURL_PROXY_HOST
=
"0.0.0.0"
;
//"10.152.18.220";
const
CURL_PROXY_PORT
=
0
;
//8080;
//=======【上报信息配置】===================================
/**
*
TODO:接口调用上报等级,默认紧错误上报(注意:上报超时间为【1s】,上报无论成败【永不抛出异常】,
* 不会影响接口调用流程),开启上报之后,方便微信监控请求调用的质量,建议至少
* 开启错误上报。
* 上报等级,0.关闭上报; 1.仅错误出错上报; 2.全量上报
*
@var
int
*/
const
REPORT_LEVENL
=
1
;
}
3、统一下单,将返回的结果传递给客户端处理
function
dopayment_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
=
new
WxPayUnifiedOrder();
$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'
]
);
return
json_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
=
new
CLogFileHandler(
"../logs/"
.
date
(
'Y-m-d'
).
'.log'
);
$log
= Log::
Init
(
$logHandler
,
15
);
class
PayNotifyCallBack
extends
WxPayNotify
{
//查询订单
public function
Queryorder(
$transaction_id
)
{
$input
=
new
WxPayOrderQuery();
$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
=
new
PayNotifyCallBack();
$notify
->Handle(
false
);
6、关闭订单