⼩程序web-view 调⽤H5页⾯判断环境并发起⼩程序⽀付接⼝⽰例完整代码⼩程序web-view调⽤H5页⾯发起⼩程序⽀付接⼝⽰例完整代码(内含详细说明,适应于Ecshop和Ectouch被⼩程序内嵌的时候 既要实现H5的⽀付 ⼜要实现 ⼩程序⽀付。当然其它内核的⾃营在线商城也是可以⽤这接⼝的)
⼩程序web-view 调⽤H5页⾯发起⼩程序⽀付接⼝⽰例
这接⼝是我熬夜写出来的,服务端⽤的PHP,⽰例很完整了,有附带说明。
您可以进>>发现>>⼩程序搜索:飞机杯男⽤ 进“飞机杯男⽤”这个⼩程序先看我做的接⼝演⽰,看这⽂章是不是您所需要的。当然⼩程序⾥⾯也有我的联系⽅式,可以通过⼩程序联系我,不忙的时可帮简单解答。希望能帮⼤家节省些时间。这⽀付接⼝可以⽤到ECtouch或其它thinkphp框架开发的站点。
接⼝说明
H5页⾯发起⼩程序⽀付代码:
看演⽰的可以进>>发现>>⼩程序搜索:飞机杯男⽤
也可以进>>发现>>⼩程序搜索:飞机杯图⽚
好了,做完发起⼩程序⽀付的js之后下⾯就是做⼩程序前端代码了,也就是发起的时候所⽤到的/pages/wxpay/wxpay接收⽂件:<script type="text/javascript" src="res.wx.qq/open/js/jweixin-1.3.2.js"></script><script language="javascript">var mini=false;Env(function(res){if (res.miniprogram){ //发起⼩程序⽀付 wx.miniProgram.navigateTo({url: "/pages/wxpay/wxpay?log_id='.$order['log_id'].'&order_id='.$order['order_id'].'"}); mini=true;}}); if(mini){ return;}else{ //发起H5⽀付}</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16var app = getApp();Page({ data: { bt: 'bt' }, onLoad: function (options) { var that = this; if (der_id) { //that.setData({ wdxop: options}), that.setLoading(options); // questPayment(options); } else { wx.navigateBack();} }, setLoading: function(a) { var that = this wx.login({ success: function(res) { // 成功的话会返回: // {errMsg: "login:ok", code: "获取⽤户OpenID 的ticket"} de,a)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
好了,下⾯就是读取⽀付参数并⽣成签名发送给⼩程序的服务器端代码了: wx.requestPayment(dat
a) }, wdxreload: function(){ var pages = getCurrentPages(); var currentPage = pages[pages.length - 1]; //获取当前页⾯的对象 var url = ute; //当前页⾯url var options = currentPage.options; //如果要获取url 中所带的参数可以查看options wx.navigateTo({ url: "/pages/wxpay/wxpay?order_id=" + der_id+ '&log_id=' + options.log_id}); } })
87
88
89
90
91
92
93
94
95
96
97
98
99
100<?php defined('IN_ECTOUCH') or die('Deny Access');class MiniPayController extends BaseController { private $appid; private $secret; public function __construct() { parent::__construct(); $payment_info = array(); $payment_info = model('Order')->payment_info(6); $RcgPayment = unserialize_config($payment_info['pay_config']); $this->appid = $RcgPayment ['miniAppid']; //此处填写您的 ⼩程序appid $this->secret = $RcgPayment ['miniSecret']; //您的⼩程序密钥 } public function login() { $params = array( 'appid' => $this->appid, 'secret' => $this->secret, 'js_code' => $_GET['js_code'], // ⼩程序传来的ticket 'grant_type' => 'authorization_code', ); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, 'api.weixin.qq/sns/jscode2session'); curl_setopt($ch, CURLOPT_RETURNTRANSFER,
1); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $params); $output = curl_exec($ch); if (false === $output) { echo 'CURL Error:' . curl_error($ch); } echo $output; } public function index() {
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
$order_id = isset($_GET['order_id']) ? intval($_GET['order_id']) : 0; $log_id = isset($_GET['log_id']) ? intval($_GET['log_id']) : 0; $this->user_id = $_SESSION['user_id']; $order = model('Users')->get_order_detail($order_id, $this->user_id); $payment_info = array(); $payment_info = model('Order')->payment_info(6); $payment = unserialize_config($payment_info['pay_config']); $t = $_GET['t']; $mch_id = $payment['wxpay_mchid'];//受理商ID(即⽀付商户号) $mch_key = $payment['wxpay_key'];//商户⽀付密钥Key $params = array( 'appid' => $this->appid, // ⼩程序appid 'mch_id' => $mch_id, 'nonce_str' => (string) mt_rand(10000, 99999), // 随机串,32字符以内 'body' => '⽇⽤品1', // 商品名 'out_trade_no' => substr( $order['order_sn'].'A'.($order['order_amount']*100).'B'.$log_id ,0,32), // 订单号32字符以内。串接后取前32位。多次⽀付时如果重
'total_fee' => $order['order_amount'] * 100, // 订单费⽤,单位:分 'spbill_create_ip' => $_SERVER['REMOTE_ADDR'], 'notify_url' => 'm.chunyigu/api/notify/minipay.php', // ⽀付成功后的回调地址,由腾讯服务端回调 'trade_type' => 'JSAPI', 'openid' => $_GET['openid'], // ⼩程序传来的OpenID ); // 按照要求计算sign ksort($params); $sequence = ''; foreach ($params as $key => $value) { $sequence .= "$key=$value&"; } $sequence = $sequence . "key=".$mch_key; $params['sign'] = strtoupper(md5($sequence)); // 给发出的请求,整个参数是个XML $xml = '<xml>' . PHP_EOL; foreach ($params as $key => $value) { $xml .= "<$key>$value</$key>" . PHP_EOL; } $xml .= '</xml>'; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, 'h.weixin.qq/pay/unifiedorder'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $xml); $output = curl_exec($ch); if (false === $output) { echo 'CURL Error:' . curl_error($ch); } // 下单成功的话,返回个XML ,⾥⾯包含prepayID ,提取出来 if (0 === preg_match('/<prepay_id><\!\[CDATA\[(\w+)\]\]><\/prepay_id>/', $output, $match)) { //echo $output; //exit(0); } // 这⾥不是给⼩程序返回个prepayID ,⽽是返回⼀个包含其他字段的JSON // 这个JSON ⼩程序⾃⼰也可以⽣成,放在服务端⽣成是出于两个考虑: // 1. ⼩程序的appid 不⽤写在⼩程序的代码⾥,appid 、secret 信息全部由服务器管理,⽐较安全464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
js获取json的key和value// 1. ⼩程序的appid 不⽤写在⼩程序的代码⾥,appid 、secret 信息全部由服务器管理,⽐较安全 // 2. 计算paySign 需要⽤到md5,⼩程序端使⽤的是JavaScript ,没有内置的md5函数,放在服务端计算md5⽐较⽅便 $prepayId = $match[1]; $response= array( 'appId' => $this->appid, //⼩程序appid 'nonceStr' => (string) mt_rand(10000, 99999), // 随机串,32个字符以内 'package' => 'prepay_id=' . $prepayId, 'signType' => 'MD5', 'timeStamp' => (string) time(), // 时间戳,注意得是字符串形式的 ); $sequence = ''; foreach ($response as $key => $value) { $sequence .= "$key=$value&"; } $response['paySign'] = strtoupper(md5("{$sequence}key=".$mch_key)); echo json_encode($response); } /** * 响应操作 */ function callback($data) { if ($_GET['status'] == 1) { return true; } else { return false; } } /** * 响应操作 */ function notify($data) { $inputdata = file_get_contents("php://input"); if (! empty($inputdata)) { $payment = model('Payment')->get_payment("wxpay"); $postdata = json_decode(json_encode(simplexml_load_string($inputdata, 'SimpleXMLElement', LIBXML_NOCDATA)), true); /* 检查插件⽂件是否存在,如果存在则验证⽀付是否成功,否则则返回失败信息 */ // 端签名 $wxsign = $postdata['sign']; unset($postdata['sign']); // 附加参数 $attach = $postdata['attach']; foreach ($postdata as $k => $v) { $Parameters[$k] = $v; } // 签名步骤⼀:按字典序排序参数 ksort($Parameters); $buff = ""; foreach ($Parameters as $k => $v) {
$buff .= $k . "=" . $v . "&"; } $String; if (strlen($buff) > 0) { $String = substr($buff, 0, strlen($buff) - 1); } // 签名步骤⼆:在string 后加⼊KEY $String = $String . "&key=" . $payment['wxpay_key'];111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论