在hbuider下的app 调用支付接口
支付宝功能申请
- 登录支付宝账号,签约申请“移动快捷支付”功能,操作流程参考:
支付宝帮助中心
- 获取PID,参考教程:
获取合作者身份ID
服务器生成订单示例(PHP)
参考开源示例代码github-支付宝
C#生成支付宝订单示例
微信支付功能申请
-
使用微信支付功能需到微信开放平台申请移动应用并开通支付功能
微信APP支付接入商户服务中心
申请应用后可以获取AppID和AppSecret值。
-
开通支付功能后可获取支付业务服务器配置数据
PARTNER:财付通商户号
PARTNER_KEY:财付通密钥
PAYSIGNKEY:支付签名密钥
参考开源示例代码github-微信支付
$result = array(
\'appid\' => $appid,
\'noncestr\'=>$parameters[\'nonce_str\'],
\'package\'=>\'Sign=WXPay\',
\'partnerid\'=>$mch_id,
\'prepayid\'=>$prepay_id,
\'timestamp\'=> time(),
);
// 重新签名
$result[\'sign\'] = $this->getSign($result, $key);
调起启用支付宝或微信 plus.payment.request(pay[id].order,function(result)
微信遇到的问题: 启动微信(需要打包测试,其中app签名确保和微信签名对应),确保获取order的值是否正确,其中,注意sigh=两次重新生成,格式为order
| 字段名 | 变量名 | 类型 | 必填 | 示例值 | 描述 |
|---|---|---|---|---|---|
| 应用ID | appid | String(32) | 是 | wx8888888888888888 | 微信开放平台审核通过的应用APPID |
| 商户号 | partnerid | String(32) | 是 | 1900000109 | 微信支付分配的商户号 |
| 预支付交易会话ID | prepayid | String(32) | 是 | WX1217752501201407033233368018 | 微信返回的支付交易会话ID |
| 扩展字段 | package | String(128) | 是 | Sign=WXPay | 暂填写固定值Sign=WXPay |
| 随机字符串 | noncestr | String(32) | 是 | 5K8264ILTKCH16CQ2502SI8ZNMTM67VS | 随机字符串,不长于32位。推荐随机数生成算法 |
| 时间戳 | timestamp | String(10) | 是 | 1412000000 | 时间戳,请见接口规则-参数规定 |
| 签名 | sign | String(32) | 是 | C380BEC2BFD727A4B6845133519F3AD6 | 签名,详见签名生成算法 |
支付宝:主要密钥是否正确 出现al59错误->确保每一个值都不为空
其中order格式
"service=\"mobile.securitypay.pay\"&partner=\"2088002409047871\"&_input_charset=\"UTF-8\"&out_trade_no=\"14682865347699\"&subject=\"余额充值\"&payment_type=\"1\"&seller_id=\"tfshop@126.com\"&total_fee=\"0\"&body=\"\"&it_b_pay=\"1d\"¬ify_url=\"http%3A%2F%2Fwww.taifengmall.com%2Fopenapi%2Fectools_payment%2Fparse%2Fectools_payment_plugin_alipayapp%2Fcallback%2F\"&sign=\"GGxRnW%2FxgYmf582zggZCZFw%2FY1nhHJRptUzHIqCT9SvsJxs4bcoOzo4cEoBkyFultEr2CowQEGAgradEtTrsZI9TSK3Rv0IheBS0EP28cSqZYOQH%2BLXqsmzI2nZiJ%2BYYD0zFcS45yzYAEn4ll8Fx4subACEzLzIM%2BBxYwHcp43g%3D\"&sign_type=\"RSA\""
遇到的问题:body为空,total_fee为0
遇到的写法js写法:
$(\'body\').on(\'ajaxSubmit.success\', \'#paycenter-form\', function (e, data){
var paytype_id = $(\'input[name=payment]:checked\').val();
$.payment($.paymentmapping[paytype_id], data, function (result){...}});
$.payment = function (type, data, successCallback, failCallback){
// 支付方式名称转换,服务端与客户端的映射
$.paymentmapping = {
\'wxpayapp\': \'wxpay\',
\'alipayapp\': \'alipay\'
};
})(jQuery);
参考文档
支付结果返回处理
支付宝
$this->callback_url = kernel::openapi_url(\'openapi.ectools_payment/parse/ectools/ectools_payment_plugin_alipayapp\', \'callback\');
public function dopay($payment) { $mer_id = trim($this->getConf(\'mer_id\', __CLASS__)); // 支付宝合作者身份ID,以2088开头的16位纯数字 $seller_id = trim($this->getConf(\'seller_id\', __CLASS__)); // 支付宝账号 $rsa_private_key = trim($this->getConf(\'rsa_private_key\', __CLASS__)); // 私钥字符串 $this->add_field(\'service\', \'mobile.securitypay.pay\'); // 必填,接口名称,固定值 $this->add_field(\'partner\', $mer_id); // 必填,合作商户号 $this->add_field(\'_input_charset\', \'UTF-8\'); // 必填,参数编码字符集 $this->add_field(\'out_trade_no\', $payment[\'payment_id\']); // 必填,商户网站唯一订单号 $this->add_field(\'subject\', $payment[\'shopName\']); // 必填,商品名称 $this->add_field(\'payment_type\', \'1\'); // 必填,支付类型 $this->add_field(\'seller_id\', $seller_id); // 必填,卖家支付宝账号 $this->add_field(\'total_fee\', floatval($payment[\'total_amount\'])); // 必填,总金额,取值范围为[0.01,100000000.00] $this->add_field(\'body\', $payment[\'body\']); // 必填,商品详情 $this->add_field(\'it_b_pay\', \'1d\'); // 可选,未付款交易的超时时间 $this->add_field(\'notify_url\',urlencode($this->callback_url)); // 可选,服务器异步通知页面路径 if($payment[\'show_url\']){ $this->add_field(\'show_url\', urlencode($payment[\'show_url\'])); // 可选,商品展示网站 } //生成订单 return $this->generate(trim($rsa_private_key)); } /** * 支付后返回后处理的事件的动作 * @params array - 所有返回的参数,包括POST和GET * @return null */ public function callback(&$recv) { $mer_id = trim($this->getConf(\'mer_id\', __CLASS__)); // 支付宝合作者身份ID,以2088开头的16位纯数字 if($this->is_return_vaild($recv, $recv[\'sign\'])){ $ret[\'payment_id\'] = $recv[\'out_trade_no\']; $ret[\'account\'] = $mer_id; $ret[\'bank\'] = app::get(\'ectools\')->_(\'支付宝支付移动版\'); $ret[\'pay_account\'] = app::get(\'ectools\')->_(\'付款帐号\'); $ret[\'currency\'] = \'CNY\'; $ret[\'money\'] = $recv[\'total_fee\']; $ret[\'paycost\'] = \'0.000\'; $ret[\'cur_money\'] = $recv[\'total_fee\']; $ret[\'trade_no\'] = $recv[\'trade_no\']; $ret[\'t_payed\'] = strtotime($recv[\'notify_time\']) ? strtotime($recv[\'notify_time\']) : time(); $ret[\'pay_app_id\'] = "alipayapp"; $ret[\'pay_type\'] = \'online\'; $ret[\'memo\'] = $recv[\'body\']; switch($recv[\'trade_status\']){ case \'TRADE_SUCCESS\': $ret[\'status\'] = \'succ\'; echo \'success\'; break; } }else{ $message = \'Invalid Sign\'; $ret[\'status\'] = \'invalid\'; echo \'fail\'; } return $ret; }
notify_url 接口异步通知url
http://ask.dcloud.net.cn/docs/#http://ask.dcloud.net.cn/article/71
个人总结,遇到问题,先看例子的返回值是怎样的,然后对比一下,记得看清楚,每一步的作用,一步一步解决
微信扫码支付:模式2
微信支付官方DEMO下载
微信支付商户平台
https://pay.weixin.qq.com/wiki/doc/api/index.html