content: package wang.imchao.plugin.alipay;
  
  import android.text.TextUtils;
  
  import com.alipay.sdk.app.PayTask;
  import org.apache.cordova.CallbackContext;
  import org.apache.cordova.CordovaInterface;
  import org.apache.cordova.CordovaPlugin;
  import org.apache.cordova.CordovaWebView;
  import org.json.JSONArray;
  import org.json.JSONException;
  import org.json.JSONObject;
  
  import java.io.UnsupportedEncodingException;
  import java.net.URLEncoder;
  
  public class AliPayPlugin extends CordovaPlugin {
      private static String TAG = "AliPayPlugin";
  
      //商户PID
      private String partner = "";
      //商户收款账号
      private String seller = "";
      //商户私钥，pkcs8格式
      private String privateKey = "";
  
      @Override
      public void initialize(CordovaInterface cordova, CordovaWebView webView) {
          super.initialize(cordova, webView);
          partner = webView.getPreferences().getString("partner", "");
          seller = webView.getPreferences().getString("seller", "");
          privateKey = webView.getPreferences().getString("private_key", "");
      }
  
      @Override
      public boolean execute(String action, JSONArray args, CallbackContext callbackContext) {
          try {
              JSONObject arguments = args.getJSONObject(0);
              String tradeNo = arguments.getString("tradeNo");
              String subject = arguments.getString("subject");
              String body = arguments.getString("body");
              String price = arguments.getString("price");
              String notifyUrl = arguments.getString("notifyUrl");
              this.pay(tradeNo, subject, body, price, notifyUrl, callbackContext);
          } catch (JSONException e) {
              callbackContext.error(new JSONObject());
              e.printStackTrace();
              return false;
          }
          return true;
      }
  
      public void pay(String tradeNo, String subject, String body, String price, String notifyUrl, final CallbackContext callbackContext) {
          // 订单
          String orderInfo = createRequestParameters(subject, body, price, tradeNo, notifyUrl);
  
          // 对订单做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();
  
          cordova.getThreadPool().execute(new Runnable() {
              @Override
              public void run() {
                  // 构造PayTask 对象
                  PayTask alipay = new PayTask(cordova.getActivity());
                  // 调用支付接口，获取支付结果
                  String result = alipay.pay(payInfo);
                  PayResult payResult = new PayResult(result);
                  if (TextUtils.equals(payResult.getResultStatus(), "9000")) {
                      callbackContext.success(payResult.toJson());
                  } else {
                      // 判断resultStatus 为非“9000”则代表可能支付失败
                      // “8000”代表支付结果因为支付渠道原因或者系统原因还在等待支付结果确认，最终交易是否成功以服务端异步通知为准（小概率状态）
                      if (TextUtils.equals(payResult.getResultStatus(), "8000")) {
                          callbackContext.success(payResult.toJson());
                      } else {
                          callbackContext.error(payResult.toJson());
                      }
                  }
              }
          });
      }
  
      /**
       * create the order info. 创建订单信息
       */
      public String createRequestParameters(String subject, String body, String price, String tradeNo, String notifyUrl) {
          // 签约合作者身份ID
          String orderInfo = "partner=" + "\"" + partner + "\"";
  
          // 签约卖家支付宝账号
          orderInfo += "&seller_id=" + "\"" + seller + "\"";
  
          // 商户网站唯一订单号
          orderInfo += "&out_trade_no=" + "\"" + tradeNo + "\"";
  
          // 商品名称
          orderInfo += "&subject=" + "\"" + subject + "\"";
  
          // 商品详情
          orderInfo += "&body=" + "\"" + body + "\"";
  
          // 商品金额
          orderInfo += "&total_fee=" + "\"" + price + "\"";
  
          // 服务器异步通知页面路径
          orderInfo += "&notify_url=" + "\"" + notifyUrl
                  + "\"";
  
          // 服务接口名称， 固定值
          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=\"m.alipay.com\"";
  
          // 调用银行卡支付，需配置此参数，参与签名， 固定值 （需要签约《无线银行卡快捷支付》才能使用）
          // orderInfo += "&paymethod=\"expressGateway\"";
  
          return orderInfo;
      }
  
      /**
       * sign the order info. 对订单信息进行签名
       *
       * @param content 待签名订单信息
       */
      public String sign(String content) {
          return SignUtils.sign(content, privateKey);
      }
  
      /**
       * get the sign type we use. 获取签名方式
       */
      public String getSignType() {
          return "sign_type=\"RSA\"";
      }
  
  }