Php集福程序,PHP:微信小程序服务端集成微信支付

换取openid->统一下单->发起支付,三步走,其中二次签名比较坑人。

该demo源码下载:

dotton-lendoo-wx-master.zip

理论上集成微信支付的全部工作可以在小程序端完成,因为小程序js有访问网络的能力,但是为了安全,不暴露敏感key,而且可以使用官方提供的现成php demo更省力,于是在服务端完成签名与发起请求,小程序端只做一个wx.requestPayment(OBJECT)接口的对接。

整体集成过程与JSAPI、APP类似,先统一下单,然后拿返回的结果来请求支付。

一共三步:

1.小程序端通过wx.login的返回的code换取openid

2.服务端向微信统一下单

3.小程序端发起支付

事先准备好这几样东西:

APPID = 'wx426b3015555a46be';

MCHID = '1900009851';

KEY = '8934e7d15453e97507ef794cf7b0519d';

APPSECRET = '7813490da6f1265e4901ffb80afaa36f';

PHP SDK,下载链接见文尾

第1、4样是申请小程序时获得的,第2、3样是申请开通微信支付时获得的,注意第3、4样长得比较像,其实是2个东西,两者混淆将导致签名通不过。

向微信端下单,得到prepay_id

1. 创建一个Controller,引并WxPay.Api.php类

require_once __DIR__ . '/BaseController.php';

require_once __DIR__ . '/../third_party/wxpay/WxPay.Api.php';

class WXPay extends BaseController {

function index() {

}

}

之后可以通过index.php/wxpay来作访问请求

2. 修改配置文件WxPay.Config.php

改成自己申请得到相应key

3. 实现index方法

function index() {

//         初始化值对象

$input = new WxPayUnifiedOrder();

//         文档提及的参数规范:商家名称-销售商品类目

$input->SetBody("灵动商城-手机");

//         订单号应该是由小程序端传给服务端的,在用户下单时即生成,demo中取值是一个生成的时间戳

$input->SetOut_trade_no('123123123');

//         费用应该是由小程序端传给服务端的,在用户下单时告知服务端应付金额,demo中取值是1,即1分钱

$input->SetTotal_fee("1");

$input->SetNotify_url("");

$input->SetTrade_type("JSAPI");

//         由小程序端传给服务端

$input->SetOpenid($this->input->post('openId'));

//         向微信统一下单,并返回order,它是一个array数组

$order = WxPayApi::unifiedOrder($input);

//         json化返回给小程序端

header("Content-Type: application/json");

echo json_encode($order);

}

说明1:文档上提到的nonce_str不是没提交,而是sdk帮我们填上的

出处在WxPay.Api.php第55行

$inputObj->SetNonce_str(self::getNonceStr());//随机字符串

说明2:sign也已经好心地给setSign了,出处在WxPay.Data.php第111行,MakeSign()中

/**

* 生成签名

* @return 签名,本函数不覆盖sign成员变量,如要设置签名需要调用SetSign方法赋值

*/

public function MakeSign()

{

//签名步骤一:按字典序排序参数

ksort($this->values);

$string = $this->ToUrlParams();

//签名步骤二:在string后加入KEY

$string = $string . "&key=".WxPayConfig::KEY;

//签名步骤三:MD5加密

$string = md5($string);

//签名步骤四:所有字符转为大写

$result = strtoupper($string);

return $result;

}

4. 小程序内调用登录接口,获取openid

向微信登录请求,拿到code,再将code提交换取openId

wx.login({

success: function(res) {

if (res.code) {

//发起网络请求

wx.request({

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值