900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > Android接入支付宝开发

Android接入支付宝开发

时间:2018-07-30 08:55:37

相关推荐

Android接入支付宝开发

Android接入支付宝接口主要分为以下几大步奏:

作为程序员,其实我们只是做了第五步的工作,假如你需要自己一个人都完成上述的操作,详细的步骤请看支付宝移动支付的官网:

/support/index.htm

下面我详细的介绍第五步的开发,

第一步:下载官方的demo,地址:

/order/productDetail.htm?productId=080604609654&tabId=4#ps-tabinfo-hash

截图如下:

解压下载下来的demo,找到如下路径的openssl.exe工具,如下图所示:

然后,单击openssl.exe,在命令里输入:genrsa -out rsa_private_key.pem 1024,点击回车,得到商家支付宝私钥,如图所示:

如果成功了,会在如下路径中得到rsa_private_key.pem文件,如图所示:

继续在命令(pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt)里操作,将RSA私钥转换成PKCS8格式,得到最终程序里需要的商家支付宝私钥,如图:

商家支付宝私钥白色标记的那个:

继续在命令行里输入(rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem)得到商家支付宝公钥,如图:

会在你的demo下生成商家支付宝公钥的文件,如图:

打开rsa_public_key.pem文件夹得到,商家支付宝公钥:

最后把商家的支付宝公钥上传到支付宝上面去。

注:如果前面的四步不是你自己完成操作,你只需要把这个商家支付宝公钥给相关的操作人员即可,然后在得到支付宝公钥。

第二步:前期的的操作搞完了,下面进行我们代码中的操作。解压文件,得到支付宝官方demo:

打开demo中的例子,修改一下的参数即可:

运行如下:

至此,开发完成。

备注:需要接入到你自己的项目中,详细代码。可以根据demo中的例子来,基本上就是封装参数而已。

第三:本人在开发的时候遇到的错误。就是支付宝公钥和商家支付宝私钥不匹配,报支付错误信息:系统繁忙,请稍后再试(ALI69)

最关键的代码如下:

package com.alipay.sdk.pay.demo;import java.io.UnsupportedEncodingException;import .URLEncoder;import java.text.SimpleDateFormat;import java.util.Date;import java.util.Locale;import java.util.Random;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.support.v4.app.FragmentActivity;import android.text.TextUtils;import android.view.View;import android.widget.Toast;import com.alipay.sdk.app.PayTask;public class PayDemoActivity extends FragmentActivity {// 商户PIDpublic static final String PARTNER = "";// 商户收款账号public static final String SELLER = "";// 商户私钥,pkcs8格式public static final String RSA_PRIVATE = "";// 支付宝公钥public static final String RSA_PUBLIC = "";private static final int SDK_PAY_FLAG = 1;private static final int SDK_CHECK_FLAG = 2;private Handler mHandler = new Handler() {public void handleMessage(Message msg) {switch (msg.what) {case SDK_PAY_FLAG: {PayResult payResult = new PayResult((String) msg.obj);// 支付宝返回此次支付结果及加签,建议对支付宝签名信息拿签约时支付宝提供的公钥做验签String resultInfo = payResult.getResult();String resultStatus = payResult.getResultStatus();// 判断resultStatus 为“9000”则代表支付成功,具体状态码代表含义可参考接口文档if (TextUtils.equals(resultStatus, "9000")) {Toast.makeText(PayDemoActivity.this, "支付成功",Toast.LENGTH_SHORT).show();} else {// 判断resultStatus 为非“9000”则代表可能支付失败// “8000”代表支付结果因为支付渠道原因或者系统原因还在等待支付结果确认,最终交易是否成功以服务端异步通知为准(小概率状态)if (TextUtils.equals(resultStatus, "8000")) {Toast.makeText(PayDemoActivity.this, "支付结果确认中",Toast.LENGTH_SHORT).show();} else {// 其他值就可以判断为支付失败,包括用户主动取消支付,或者系统返回的错误Toast.makeText(PayDemoActivity.this, "支付失败",Toast.LENGTH_SHORT).show();}}break;}case SDK_CHECK_FLAG: {Toast.makeText(PayDemoActivity.this, "检查结果为:" + msg.obj,Toast.LENGTH_SHORT).show();break;}default:break;}};};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.pay_main);}/*** call alipay sdk pay. 调用SDK支付* */public void pay(View v) {// 订单String orderInfo = getOrderInfo("测试的商品", "该测试商品的详细描述", "0.01");// 对订单做RSA 签名String sign = sign(orderInfo);try {// 仅需对sign 做URL编码sign = URLEncoder.encode(sign, "UTF-8");} catch (UnsupportedEncodingException e) {e.printStackTrace();}// 完整的符合支付宝参数规范的订单信息final String payInfo = orderInfo + "&sign=\"" + sign + "\"&"+ getSignType();Runnable payRunnable = new Runnable() {@Overridepublic void run() {// 构造PayTask 对象PayTask alipay = new PayTask(PayDemoActivity.this);// 调用支付接口,获取支付结果String result = alipay.pay(payInfo);Message msg = new Message();msg.what = SDK_PAY_FLAG;msg.obj = result;mHandler.sendMessage(msg);}};// 必须异步调用Thread payThread = new Thread(payRunnable);payThread.start();}/*** 查询终端设备是否存在支付宝认证账户*/public void check(View v) {Runnable checkRunnable = new Runnable() {@Overridepublic void run() {// 构造PayTask 对象PayTask payTask = new PayTask(PayDemoActivity.this);// 调用查询接口,获取查询结果boolean isExist = payTask.checkAccountIfExist();Message msg = new Message();msg.what = SDK_CHECK_FLAG;msg.obj = isExist;mHandler.sendMessage(msg);}};Thread checkThread = new Thread(checkRunnable);checkThread.start();}/*** get the sdk version. 获取SDK版本号* */public void getSDKVersion() {PayTask payTask = new PayTask(this);String version = payTask.getVersion();Toast.makeText(this, version, Toast.LENGTH_SHORT).show();}/*** create the order info. 创建订单信息* */public String getOrderInfo(String subject, String body, String price) {// 签约合作者身份IDString orderInfo = "partner=" + "\"" + PARTNER + "\"";// 签约卖家支付宝账号orderInfo += "&seller_id=" + "\"" + SELLER + "\"";// 商户网站唯一订单号orderInfo += "&out_trade_no=" + "\"" + getOutTradeNo() + "\"";// 商品名称orderInfo += "&subject=" + "\"" + subject + "\"";// 商品详情orderInfo += "&body=" + "\"" + body + "\"";// 商品金额orderInfo += "&total_fee=" + "\"" + price + "\"";// 服务器异步通知页面路径orderInfo += "&notify_url=" + "\"" + "http://notify.msp.hk/notify.htm"+ "\"";// 服务接口名称, 固定值orderInfo += "&service=\"mobile.securitypay.pay\"";// 支付类型, 固定值orderInfo += "&payment_type=\"1\"";// 参数编码, 固定值orderInfo += "&_input_charset=\"utf-8\"";// 设置未付款交易的超时时间// 默认30分钟,一旦超时,该笔交易就会自动被关闭。// 取值范围:1m~15d。// m-分钟,h-小时,d-天,1c-当天(无论交易何时创建,都在0点关闭)。// 该参数数值不接受小数点,如1.5h,可转换为90m。orderInfo += "&it_b_pay=\"30m\"";// extern_token为经过快登授权获取到的alipay_open_id,带上此参数用户将使用授权的账户进行支付// orderInfo += "&extern_token=" + "\"" + extern_token + "\"";// 支付宝处理完请求后,当前页面跳转到商户指定页面的路径,可空orderInfo += "&return_url=\"\"";// 调用银行卡支付,需配置此参数,参与签名, 固定值 (需要签约《无线银行卡快捷支付》才能使用)// orderInfo += "&paymethod=\"expressGateway\"";return orderInfo;}/*** get the out_trade_no for an order. 生成商户订单号,该值在商户端应保持唯一(可自定义格式规范)* */public String getOutTradeNo() {SimpleDateFormat format = new SimpleDateFormat("MMddHHmmss",Locale.getDefault());Date date = new Date();String key = format.format(date);Random r = new Random();key = key + r.nextInt();key = key.substring(0, 15);return key;}/*** sign the order info. 对订单信息进行签名* * @param content* 待签名订单信息*/public String sign(String content) {return SignUtils.sign(content, RSA_PRIVATE);}/*** get the sign type we use. 获取签名方式* */public String getSignType() {return "sign_type=\"RSA\"";}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。